in tough/src/io.rs [28:52]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
assert!(
self.digest.is_some(),
"DigestAdapter::read called after end of file"
);
let size = self.reader.read(buf)?;
if size == 0 {
let result = std::mem::replace(&mut self.digest, None).unwrap().finish();
if result.as_ref() != self.hash.as_slice() {
error::HashMismatchSnafu {
context: self.url.to_string(),
calculated: hex::encode(result),
expected: hex::encode(&self.hash),
}
.fail()?;
}
Ok(size)
} else if let Some(digest) = &mut self.digest {
digest.update(&buf[..size]);
Ok(size)
} else {
unreachable!();
}
}