From f80947fbfd9b2c092034f3c25449257c67c47e91 Mon Sep 17 00:00:00 2001 From: debris Date: Tue, 20 Sep 2016 16:18:50 +0200 Subject: [PATCH] net addr message --- net/src/messages/addr.rs | 89 +++++++++++++++++++++++++++++++++++++ net/src/messages/mod.rs | 2 + net/src/messages/payload.rs | 7 ++- 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 net/src/messages/addr.rs diff --git a/net/src/messages/addr.rs b/net/src/messages/addr.rs new file mode 100644 index 00000000..ccb335d5 --- /dev/null +++ b/net/src/messages/addr.rs @@ -0,0 +1,89 @@ +use ser::{ + Serializable, Stream, + Deserializable, Reader, Error as ReaderError, +}; +use common::NetAddress; + +#[derive(Debug, PartialEq)] +pub struct AddressEntry { + pub timestamp: u32, + pub address: NetAddress, +} + +impl Serializable for AddressEntry { + fn serialize(&self, stream: &mut Stream) { + stream + .append(&self.timestamp) + .append(&self.address); + } +} + +impl Deserializable for AddressEntry { + fn deserialize(reader: &mut Reader) -> Result where Self: Sized { + let entry = AddressEntry { + timestamp: try!(reader.read()), + address: try!(reader.read()), + }; + + Ok(entry) + } +} + +#[derive(Debug, PartialEq)] +pub struct Addr { + pub addresses: Vec, +} + +impl Serializable for Addr { + fn serialize(&self, stream: &mut Stream) { + stream.append_list(&self.addresses); + } +} + +impl Deserializable for Addr { + fn deserialize(reader: &mut Reader) -> Result where Self: Sized { + let result = Addr { + addresses: try!(reader.read_list()), + }; + + Ok(result) + } +} + +#[cfg(test)] +mod tests { + use bytes::Bytes; + use ser::{serialize, deserialize}; + use super::{Addr, AddressEntry}; + + #[test] + fn test_addr_serialize() { + let expected: Bytes = "01e215104d010000000000000000000000000000000000ffff0a000001208d".into(); + let addr = Addr { + addresses: vec![ + AddressEntry { + timestamp: 0x4d1015e2, + address: "010000000000000000000000000000000000ffff0a000001208d".into(), + }, + ], + }; + + assert_eq!(serialize(&addr), expected); + } + + #[test] + fn test_addr_deserialize() { + let raw: Bytes = "01e215104d010000000000000000000000000000000000ffff0a000001208d".into(); + let expected = Addr { + addresses: vec![ + AddressEntry { + timestamp: 0x4d1015e2, + address: "010000000000000000000000000000000000ffff0a000001208d".into(), + }, + ], + }; + + assert_eq!(expected, deserialize(&raw).unwrap()); + } +} + diff --git a/net/src/messages/mod.rs b/net/src/messages/mod.rs index 67185e6f..a2d19e2b 100644 --- a/net/src/messages/mod.rs +++ b/net/src/messages/mod.rs @@ -1,8 +1,10 @@ +mod addr; mod message; mod message_header; mod payload; mod version; +pub use self::addr::Addr; pub use self::message::Message; pub use self::message_header::MessageHeader; pub use self::payload::Payload; diff --git a/net/src/messages/payload.rs b/net/src/messages/payload.rs index 3acaf8ce..512d1395 100644 --- a/net/src/messages/payload.rs +++ b/net/src/messages/payload.rs @@ -3,12 +3,13 @@ use ser::{ Reader, Error as ReaderError }; use common::Command; -use messages::{Version}; +use messages::{Version, Addr}; #[derive(Debug, PartialEq)] pub enum Payload { Version(Version), Verack, + Addr(Addr), } impl Payload { @@ -16,6 +17,7 @@ impl Payload { match *self { Payload::Version(_) => "version".into(), Payload::Verack => "verack".into(), + Payload::Addr(_) => "addr".into(), } } @@ -35,6 +37,9 @@ impl Serializable for Payload { stream.append(version); }, Payload::Verack => {}, + Payload::Addr(ref addr) => { + stream.append(addr); + }, } } }