1pub fn sha256_digest(path: impl AsRef<std::path::Path>) -> anyhow::Result<Option<String>> {
6 log::trace!("determining sha256 of {}", path.as_ref().display());
7 if !path.as_ref().exists() {
8 return Ok(None);
9 }
10
11 fn sha256<R: std::io::Read>(mut reader: R) -> anyhow::Result<ring::digest::Digest> {
12 let mut context = ring::digest::Context::new(&ring::digest::SHA256);
13 let mut buffer = [0; 1024];
14
15 loop {
16 let count = reader.read(&mut buffer)?;
17 if count == 0 {
18 break;
19 }
20 context.update(&buffer[..count]);
21 }
22
23 Ok(context.finish())
24 }
25
26 let input = std::fs::File::open(path)?;
27 let reader = std::io::BufReader::new(input);
28 let digest = sha256(reader)?;
29 Ok(Some(data_encoding::HEXUPPER.encode(digest.as_ref())))
30}