use std::path::Path; use filebuffer::FileBuffer; use tracing::{debug, trace}; use upend_base::hash::UpMultihash; #[derive(Default)] pub struct LoggerSink { pub buffer: Vec, } impl std::io::Write for LoggerSink { fn write(&mut self, buf: &[u8]) -> std::io::Result { self.buffer.extend(buf.iter()); if self.buffer.ends_with(b"\n") { self.flush()?; } Ok(buf.len()) } fn flush(&mut self) -> std::io::Result<()> { use std::str; debug!( "{}", str::from_utf8(self.buffer.as_mut()) .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))? .trim() ); Ok(()) } } pub fn hash_at_path>(path: P) -> anyhow::Result { let path = path.as_ref(); trace!("Hashing {:?}...", path); let fbuffer = FileBuffer::open(path)?; trace!("Finished hashing {:?}...", path); Ok(upend_base::hash::sha256hash(&fbuffer)?) }