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, 0, 2, 0, 0, 192, 0, 2, 100, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, ]
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, 0, 2, 0, 0, 192, 0, 2, 100, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 0, 2, 0, 0, 192, 0, 2, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 192, 0, 2, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, ]
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, 0, 2, 1, 2, 192, 0, 2, 100, 255, 255, 255, 0, 192, 0, 2, 111, 4, 3, 2, 1, ]
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, 0, 2, 1, 2, 192, 0, 2, 100, 255, 255, 255, 0, 192, 0, 2, 200, 4, 3, 2, 1, 0, 2, 0, 1, 192, 0, 2, 101, 255, 255, 255, 0, 192, 0, 2, 201, 0, 0, 0, 1, 0, 2, 0, 2, 192, 0, 2, 102, 255, 255, 255, 0, 192, 0, 2, 202, 0, 0, 0, 2, ]
201 );
202 }
203}