use anyhow::anyhow;
use sha2::{Digest, Sha256};
use std::{fs::File, io::Read};
pub fn read_hash(hash: &str) -> anyhow::Result<[u8; 32]> {
let hash = hex::decode(hash);
if let Ok(hash) = hash
&& hash.len() == 32
{
let hash: [u8; 32] = hash.as_slice().try_into()?;
return Ok(hash);
}
Err(anyhow!("Invalid hash"))
}
pub fn hash_from_file(path: &str) -> anyhow::Result<[u8; 32]> {
if let Ok(mut file) = File::open(path) {
let mut hasher = Sha256::new();
let mut file_len = if let Ok(metadata) = file.metadata() {
metadata.len()
} else {
return Err(anyhow!("Failed to read file's metadata"));
};
loop {
let len = if file_len >= 10 {
file_len -= 10;
10
} else {
file_len
};
let mut buf = vec![0u8; len as usize];
if let Err(err) = file.read_exact(&mut buf) {
eprintln!("{}", err);
}
hasher.update(&buf);
if len < 10 {
break;
}
}
let hash: [u8; 32] = hasher.finalize().into();
Ok(hash)
} else {
Err(anyhow!("Cannot open file"))
}
}