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)
	}
}