kitab

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | LICENSE

commit 800291aa0fbd8c496da676b174626918a1e9678d
parent 3ce30bf68cb808f58f20359c9c6b95a2a5966c4d
Author: lash <dev@holbrook.no>
Date:   Sat, 25 Jun 2022 17:09:59 +0000

Calculate digest from file in from xattr

Diffstat:
Msrc/meta.rs | 38++++++++++++++++++++++++++++++++------
Msrc/rdf.rs | 7+++----
2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/src/meta.rs b/src/meta.rs @@ -9,9 +9,15 @@ use sha2::{ Sha512, Digest, }; +use std::fs::{ + File, + metadata, +}; +use std::io::Read; use unic_langid_impl::LanguageIdentifier; use biblatex::EntryType; use std::str::FromStr; +use std::os::linux::fs::MetadataExt; use crate::dc::DCMetaData; @@ -104,6 +110,22 @@ impl MetaData { hex::encode(&self.digest) } + fn digest_from_path(filepath: &path::Path) -> Vec<u8> { + let mut h = Sha512::new(); + let st = metadata(filepath).unwrap(); + let bs: u64 = st.st_blksize(); + let sz: u64 = st.st_size(); + let mut b: Vec<u8> = vec!(0; bs as usize); + let mut f = File::open(filepath).unwrap(); + let mut i: usize = 0; + while i < sz as usize { + let c = f.read(&mut b).unwrap(); + h.update(&b[..c]); + i += c; + } + h.finalize().to_vec() + } + pub fn from_xattr(filepath: &path::Path) -> MetaData { let mut title: String = String::new(); @@ -111,6 +133,14 @@ impl MetaData { let mut typ: EntryType = EntryType::Unknown(String::new()); let filename: FileName; + let digest = MetaData::digest_from_path(filepath); + + filename = filepath.file_name() + .unwrap() + .to_os_string() + .into_string() + .unwrap(); + let title_src = xattr::get(filepath, "user.dcterms:title").unwrap(); match title_src { Some(v) => { @@ -129,11 +159,6 @@ impl MetaData { None => {}, } - filename = filepath.file_name() - .unwrap() - .to_os_string() - .into_string() - .unwrap(); let typ_src = xattr::get(filepath, "user.dcterms:type").unwrap(); match typ_src { @@ -144,7 +169,7 @@ impl MetaData { None => {}, } - let mut metadata = MetaData::new(title.as_str(), author.as_str(), typ, vec!(), Some(filename)); + let mut metadata = MetaData::new(title.as_str(), author.as_str(), typ, digest, Some(filename)); match xattr::get(filepath, "user.dcterms:subject") { Ok(v) => { @@ -187,5 +212,6 @@ mod tests { let meta = MetaData::from_xattr(s); assert_eq!(meta.dc.title, "Bitcoin: A Peer-to-Peer Electronic Cash System"); assert_eq!(meta.dc.author, "Satoshi Nakamoto"); + assert_eq!(meta.fingerprint(), String::from("2ac531ee521cf93f8419c2018f770fbb42c65396178e079a416e7038d3f9ab9fc2c35c4d838bc8b5dd68f4c13759fe9cdf90a46528412fefe1294cb26beabf4e")); } } diff --git a/src/rdf.rs b/src/rdf.rs @@ -16,7 +16,7 @@ use rio_api::formatter::TriplesFormatter; use crate::meta::MetaData; -pub fn write_rdf(entry: &MetaData, w: impl Write) -> Result<usize, std::io::Error> { +pub fn write(entry: &MetaData, w: impl Write) -> Result<usize, std::io::Error> { let mut tfmt = TurtleFormatter::new(w); let urn_str = format!("URN:sha512:{}", entry.fingerprint()); @@ -83,7 +83,7 @@ pub fn write_rdf(entry: &MetaData, w: impl Write) -> Result<usize, std::io::Erro #[cfg(test)] mod tests { - use super::write_rdf; + use super::write; use super::MetaData; use std::io::stdout; use std::default::Default; @@ -97,8 +97,7 @@ mod tests { m.set_subject("baz"); m.set_mime_str("foo/bar"); m.set_language("en-US"); - //let v = Vec::default(); let v = stdout(); - let r = write_rdf(&m, v); + let r = write(&m, v); } }