net addr message

This commit is contained in:
debris 2016-09-20 16:18:50 +02:00
parent e5da98b224
commit f80947fbfd
3 changed files with 97 additions and 1 deletions

89
net/src/messages/addr.rs Normal file
View File

@ -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<Self, ReaderError> 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<AddressEntry>,
}
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<Self, ReaderError> 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());
}
}

View File

@ -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;

View File

@ -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);
},
}
}
}