fn read()

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!();
        }
    }