diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..93627f1 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,44 @@ +use sha2::{Digest, Sha256}; +use std::fs::File; +use std::io::{BufReader, Read}; +use std::path::{Path, PathBuf}; + +const BUF_SIZE: usize = 4096; + +#[derive(Debug)] +pub struct FileChecksum { + pub filename: PathBuf, + pub checksum: String, +} + +impl FileChecksum { + pub fn new(filename: &Path, checksum: String) -> Self { + Self { + filename: filename.to_path_buf(), + checksum, + } + } + + pub fn print(&self) { + println!("{} {}", self.checksum, self.filename.display()); + } +} + +pub fn checksum(filename: &Path) -> Result<FileChecksum, std::io::Error> { + let mut checksum = Sha256::new(); + + let file = File::open(filename)?; + let mut reader = BufReader::new(file); + loop { + let mut buf = vec![0; BUF_SIZE]; + let n = reader.read(&mut buf)?; + if n == 0 { + break; + } + checksum.update(&buf[..n]); + } + + let checksum = checksum.finalize(); + let checksum = format!("{checksum:x}"); + Ok(FileChecksum::new(filename, checksum)) +} |