tele/
utils.rs

1//! Utilities for working with `teleform`.
2
3/// Returns the sha256 digest of the file at the given path *if it exists*.
4/// If the file does _not_ exist it returns `Ok(None)`.
5pub 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}