net addr message
This commit is contained in:
parent
e5da98b224
commit
f80947fbfd
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue