summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs44
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))
+}