use anyhow::{Context, Result};
use sha2::{Digest, Sha256};
use std::fmt::Write as FmtWrite;
use std::fs::File;
use std::io::{BufReader, Read};
use std::path::Path;
pub fn hash_file(path: &Path) -> Result<String> {
let file = File::open(path).with_context(|| format!("failed to open {} for hashing", path.display()))?;
let mut reader = BufReader::new(file);
let mut hasher = Sha256::new();
let mut buffer = [0_u8; 8192];
loop {
let bytes_read = reader.read(&mut buffer)?;
if bytes_read == 0 {
break;
}
hasher.update(&buffer[..bytes_read]);
}
Ok(encode_hex(&hasher.finalize()))
}
fn encode_hex(bytes: &[u8]) -> String {
let mut output = String::with_capacity(bytes.len() * 2);
for byte in bytes {
write!(&mut output, "{:02x}", byte).expect("writing to string cannot fail");
}
output
}