rustradio/
hasher.rs

1//! Hash input until EOF, outputting the results.
2use sha2::Digest;
3
4use crate::Result;
5use crate::block::{Block, BlockRet};
6use crate::stream::{NCReadStream, NCWriteStream, ReadStream};
7
8#[derive(rustradio_macros::Block)]
9#[rustradio(crate, new)]
10pub struct Hasher {
11    #[rustradio(in)]
12    src: ReadStream<u8>,
13    #[rustradio(out)]
14    dst: NCWriteStream<Vec<u8>>,
15
16    hasher: sha2::Sha512,
17}
18
19impl Block for Hasher {
20    fn work(&mut self) -> Result<BlockRet<'_>> {
21        let (i, _) = self.src.read_buf()?;
22        let n = i.len();
23        self.hasher.update(i.slice());
24        i.consume(n);
25        Ok(BlockRet::WaitForStream(&self.src, 1))
26    }
27}
28
29impl Drop for Hasher {
30    fn drop(&mut self) {
31        let res = self.hasher.clone().finalize();
32        self.dst.push(res.to_vec(), &[]);
33    }
34}
35
36#[must_use]
37pub fn sha512(src: ReadStream<u8>) -> (Hasher, NCReadStream<Vec<u8>>) {
38    Hasher::new(src, sha2::Sha512::new())
39}