cs_mwc_bch/messages/
node_addr_ex.rs

1use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
2use messages::node_addr::NodeAddr;
3use std::io;
4use std::io::{Read, Write};
5use util::{Result, Serializable};
6
7/// Node network address extended with a last connected time
8#[derive(Debug, Default, PartialEq, Eq, Hash, Clone)]
9pub struct NodeAddrEx {
10    /// Last connected time in seconds since the unix epoch
11    pub last_connected_time: u32,
12    /// Node address
13    pub addr: NodeAddr,
14}
15
16impl NodeAddrEx {
17    /// Size of the NodeAddrEx in bytes
18    pub const SIZE: usize = NodeAddr::SIZE + 4;
19
20    /// Returns the size of the address in bytes
21    pub fn size(&self) -> usize {
22        NodeAddrEx::SIZE
23    }
24}
25
26impl Serializable<NodeAddrEx> for NodeAddrEx {
27    fn read(reader: &mut dyn Read) -> Result<NodeAddrEx> {
28        Ok(NodeAddrEx {
29            last_connected_time: reader.read_u32::<LittleEndian>()?,
30            addr: NodeAddr::read(reader)?,
31        })
32    }
33
34    fn write(&self, writer: &mut dyn Write) -> io::Result<()> {
35        writer.write_u32::<LittleEndian>(self.last_connected_time)?;
36        self.addr.write(writer)?;
37        Ok(())
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use std::io::Cursor;
45    use std::net::Ipv6Addr;
46
47    #[test]
48    fn write_read() {
49        let mut v = Vec::new();
50        let a = NodeAddrEx {
51            last_connected_time: 12345,
52            addr: NodeAddr {
53                services: 1,
54                ip: Ipv6Addr::from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
55                port: 123,
56            },
57        };
58        a.write(&mut v).unwrap();
59        assert!(v.len() == a.size());
60        assert!(NodeAddrEx::read(&mut Cursor::new(&v)).unwrap() == a);
61    }
62}