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;
|
||||||
mod message_header;
|
mod message_header;
|
||||||
mod payload;
|
mod payload;
|
||||||
mod version;
|
mod version;
|
||||||
|
|
||||||
|
pub use self::addr::Addr;
|
||||||
pub use self::message::Message;
|
pub use self::message::Message;
|
||||||
pub use self::message_header::MessageHeader;
|
pub use self::message_header::MessageHeader;
|
||||||
pub use self::payload::Payload;
|
pub use self::payload::Payload;
|
||||||
|
|
|
@ -3,12 +3,13 @@ use ser::{
|
||||||
Reader, Error as ReaderError
|
Reader, Error as ReaderError
|
||||||
};
|
};
|
||||||
use common::Command;
|
use common::Command;
|
||||||
use messages::{Version};
|
use messages::{Version, Addr};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum Payload {
|
pub enum Payload {
|
||||||
Version(Version),
|
Version(Version),
|
||||||
Verack,
|
Verack,
|
||||||
|
Addr(Addr),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Payload {
|
impl Payload {
|
||||||
|
@ -16,6 +17,7 @@ impl Payload {
|
||||||
match *self {
|
match *self {
|
||||||
Payload::Version(_) => "version".into(),
|
Payload::Version(_) => "version".into(),
|
||||||
Payload::Verack => "verack".into(),
|
Payload::Verack => "verack".into(),
|
||||||
|
Payload::Addr(_) => "addr".into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +37,9 @@ impl Serializable for Payload {
|
||||||
stream.append(version);
|
stream.append(version);
|
||||||
},
|
},
|
||||||
Payload::Verack => {},
|
Payload::Verack => {},
|
||||||
|
Payload::Addr(ref addr) => {
|
||||||
|
stream.append(addr);
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue