rip_rs/
serializer.rs

1use crate::packet::Packet;
2use crate::v1;
3use crate::v2;
4use thiserror::Error;
5
6#[derive(Error, Debug, PartialEq)]
7pub enum SerializeError {
8    #[error("encountered the unknown command kind")]
9    UnknownCommandKind,
10    #[error("encountered the unknown version")]
11    UnknownVersion,
12    #[error("encountered the unknown address family identifier")]
13    UnknownAddressFamilyIdentifier,
14}
15
16pub(crate) trait Serializable {
17    fn to_bytes(&self) -> Result<Vec<u8>, SerializeError>;
18}
19
20pub fn serialize_v1_packet(packet: Packet<v1::Entry>) -> Result<Vec<u8>, SerializeError> {
21    packet.to_bytes()
22}
23
24pub fn serialize_v2_packet(packet: Packet<v2::Entry>) -> Result<Vec<u8>, SerializeError> {
25    packet.to_bytes()
26}
27
28#[cfg(test)]
29mod tests {
30    use crate::header::Header;
31    use crate::packet::Packet;
32    use crate::serializer::{serialize_v1_packet, serialize_v2_packet};
33    use crate::{address_family, command, v1, v2, version};
34    use std::net::Ipv4Addr;
35
36    #[test]
37    fn test_v1_packet_has_single_entry_to_bytes() {
38        let packet = Packet::make_v1_packet(
39            Header::new(command::Kind::Response, version::Version::Version1),
40            vec![v1::Entry::new(
41                address_family::Identifier::IP,
42                Ipv4Addr::new(192, 0, 2, 100),
43                67305985,
44            )],
45        )
46        .unwrap();
47
48        let serialization_result = serialize_v1_packet(packet);
49
50        assert_eq!(serialization_result.is_ok(), true);
51        assert_eq!(
52            serialization_result.unwrap(),
53            vec![
54                2, 1, 0, 0, //
55                0, 2, 0, 0, //
56                192, 0, 2, 100, //
57                0, 0, 0, 0, //
58                0, 0, 0, 0, //
59                4, 3, 2, 1, //
60            ]
61        );
62    }
63
64    #[test]
65    fn test_v1_packet_has_multi_entries_to_bytes() {
66        let packet = Packet::make_v1_packet(
67            Header::new(command::Kind::Response, version::Version::Version1),
68            vec![
69                v1::Entry::new(
70                    address_family::Identifier::IP,
71                    Ipv4Addr::new(192, 0, 2, 100),
72                    67305985,
73                ),
74                v1::Entry::new(
75                    address_family::Identifier::IP,
76                    Ipv4Addr::new(192, 0, 2, 101),
77                    1,
78                ),
79                v1::Entry::new(
80                    address_family::Identifier::IP,
81                    Ipv4Addr::new(192, 0, 2, 102),
82                    2,
83                ),
84            ],
85        )
86        .unwrap();
87
88        let serialization_result = serialize_v1_packet(packet);
89
90        assert_eq!(serialization_result.is_ok(), true);
91        assert_eq!(
92            serialization_result.unwrap(),
93            vec![
94                2, 1, 0, 0, //
95                0, 2, 0, 0, //
96                192, 0, 2, 100, //
97                0, 0, 0, 0, //
98                0, 0, 0, 0, //
99                4, 3, 2, 1, //
100                0, 2, 0, 0, //
101                192, 0, 2, 101, //
102                0, 0, 0, 0, //
103                0, 0, 0, 0, //
104                0, 0, 0, 1, //
105                0, 2, 0, 0, //
106                192, 0, 2, 102, //
107                0, 0, 0, 0, //
108                0, 0, 0, 0, //
109                0, 0, 0, 2, //
110            ]
111        );
112    }
113
114    #[test]
115    fn test_v2_packet_has_single_entry_to_bytes() {
116        let packet = Packet::make_v2_packet(
117            Header::new(command::Kind::Response, version::Version::Version2),
118            vec![v2::Entry::new(
119                address_family::Identifier::IP,
120                258,
121                Ipv4Addr::new(192, 0, 2, 100),
122                Ipv4Addr::new(255, 255, 255, 0),
123                Ipv4Addr::new(192, 0, 2, 111),
124                67305985,
125            )],
126        )
127        .unwrap();
128
129        let serialization_result = serialize_v2_packet(packet);
130
131        assert_eq!(serialization_result.is_ok(), true);
132        assert_eq!(
133            serialization_result.unwrap(),
134            vec![
135                2, 2, 0, 0, //
136                0, 2, 1, 2, //
137                192, 0, 2, 100, //
138                255, 255, 255, 0, //
139                192, 0, 2, 111, //
140                4, 3, 2, 1, //
141            ]
142        );
143    }
144
145    #[test]
146    fn test_v2_packet_has_multi_entries_to_bytes() {
147        let packet = Packet::make_v2_packet(
148            Header::new(command::Kind::Response, version::Version::Version2),
149            vec![
150                v2::Entry::new(
151                    address_family::Identifier::IP,
152                    258,
153                    Ipv4Addr::new(192, 0, 2, 100),
154                    Ipv4Addr::new(255, 255, 255, 0),
155                    Ipv4Addr::new(192, 0, 2, 200),
156                    67305985,
157                ),
158                v2::Entry::new(
159                    address_family::Identifier::IP,
160                    1,
161                    Ipv4Addr::new(192, 0, 2, 101),
162                    Ipv4Addr::new(255, 255, 255, 0),
163                    Ipv4Addr::new(192, 0, 2, 201),
164                    1,
165                ),
166                v2::Entry::new(
167                    address_family::Identifier::IP,
168                    2,
169                    Ipv4Addr::new(192, 0, 2, 102),
170                    Ipv4Addr::new(255, 255, 255, 0),
171                    Ipv4Addr::new(192, 0, 2, 202),
172                    2,
173                ),
174            ],
175        )
176        .unwrap();
177
178        let serialization_result = serialize_v2_packet(packet);
179
180        assert_eq!(serialization_result.is_ok(), true);
181        assert_eq!(
182            serialization_result.unwrap(),
183            vec![
184                2, 2, 0, 0, //
185                0, 2, 1, 2, //
186                192, 0, 2, 100, //
187                255, 255, 255, 0, //
188                192, 0, 2, 200, //
189                4, 3, 2, 1, //
190                0, 2, 0, 1, //
191                192, 0, 2, 101, //
192                255, 255, 255, 0, //
193                192, 0, 2, 201, //
194                0, 0, 0, 1, //
195                0, 2, 0, 2, //
196                192, 0, 2, 102, //
197                255, 255, 255, 0, //
198                192, 0, 2, 202, //
199                0, 0, 0, 2, //
200            ]
201        );
202    }
203}