use ser::{CompactInteger, Deserializable, Error as ReaderError, Reader, Serializable, Stream}; use std::io; use zebra_chain::BlockHeader; use {MessageResult, Payload}; pub const HEADERS_MAX_HEADERS_LEN: usize = 160; #[derive(Debug, PartialEq)] pub struct Headers { pub headers: Vec, } impl Headers { pub fn with_headers(headers: Vec) -> Self { Headers { headers: headers } } } #[derive(Debug, PartialEq)] struct HeaderWithTxnCount { header: BlockHeader, } impl From for BlockHeader { fn from(header: HeaderWithTxnCount) -> BlockHeader { header.header } } #[derive(Debug, PartialEq)] struct HeaderWithTxnCountRef<'a> { header: &'a BlockHeader, } impl<'a> From<&'a BlockHeader> for HeaderWithTxnCountRef<'a> { fn from(header: &'a BlockHeader) -> Self { HeaderWithTxnCountRef { header: header } } } impl Payload for Headers { fn version() -> u32 { 0 } fn command() -> &'static str { "headers" } fn deserialize_payload(reader: &mut Reader, _version: u32) -> MessageResult where T: io::Read, { let headers_with_txn_count: Vec = try!(reader.read_list()); let headers = Headers { headers: headers_with_txn_count.into_iter().map(Into::into).collect(), }; Ok(headers) } fn serialize_payload(&self, stream: &mut Stream, _version: u32) -> MessageResult<()> { let headers_with_txn_count: Vec = self.headers.iter().map(Into::into).collect(); stream.append_list(&headers_with_txn_count); Ok(()) } } impl<'a> Serializable for HeaderWithTxnCountRef<'a> { fn serialize(&self, stream: &mut Stream) { stream .append(self.header) .append(&CompactInteger::from(0u32)); } } impl Deserializable for HeaderWithTxnCount { fn deserialize(reader: &mut Reader) -> Result where T: io::Read, { let header = HeaderWithTxnCount { header: try!(reader.read()), }; let txn_count: CompactInteger = try!(reader.read()); if txn_count != 0u32.into() { return Err(ReaderError::MalformedData); } Ok(header) } }