1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
use std::io; use hash::H256; use crypto::{DHash256, Digest}; use ser::{Reader, Error as ReaderError, Deserializable}; pub struct HashedData<T> { pub size: usize, pub hash: H256, pub data: T, } pub trait ReadAndHash { fn read_and_hash<T>(&mut self) -> Result<HashedData<T>, ReaderError> where T: Deserializable; } impl<R> ReadAndHash for Reader<R> where R: io::Read { fn read_and_hash<T>(&mut self) -> Result<HashedData<T>, ReaderError> where T: Deserializable { let mut size = 0usize; let mut hasher = DHash256::new(); let data = self.read_with_proxy(|bytes| { size += bytes.len(); hasher.input(bytes); })?; let result = HashedData { hash: hasher.finish(), data: data, size: size, }; Ok(result) } }