jppe/encode/
impls_address.rs1use crate::std::*;
2use crate::fields::MacAddress;
3use crate::{ByteOrder, get_byteorder};
4
5
6impl crate::ByteEncode for MacAddress {
7 #[inline]
8 fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, _fattr: Option<&crate::FieldAttrModifiers>) {
9 input.extend_from_slice(self);
10 }
11}
12
13
14impl crate::BorrowByteEncode for MacAddress {
15 #[inline]
16 fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, _fattr: Option<&crate::FieldAttrModifiers>) {
17 input.extend_from_slice(self);
18 }
19}
20
21
22impl crate::ByteEncode for Ipv4Addr {
23 #[inline]
24 fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
25 let byteorder = get_byteorder(cattr, fattr);
26
27 if byteorder == ByteOrder::Be {
28 input.extend(self.octets());
29 }
30 else {
31 let mut value = self.octets();
32 value.reverse();
33 input.extend(value);
34 }
35 }
36}
37
38
39impl crate::BorrowByteEncode for Ipv4Addr {
40 #[inline]
41 fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
42 crate::ByteEncode::encode(self, input, cattr, fattr)
43 }
44}
45
46
47impl crate::ByteEncode for Ipv6Addr {
48 #[inline]
49 fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
50 let byteorder = get_byteorder(cattr, fattr);
51
52 if byteorder == ByteOrder::Be {
53 input.extend(self.octets());
54 }
55 else {
56 let mut value = self.octets();
57 value.reverse();
58 input.extend(value);
59 }
60 }
61}
62
63
64impl crate::BorrowByteEncode for Ipv6Addr {
65 #[inline]
66 fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
67 crate::ByteEncode::encode(self, input, cattr, fattr)
68 }
69}
70
71
72impl crate::ByteEncode for IpAddr {
73 #[inline]
74 fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
75 match self {
76 Self::V4(v) => v.encode(input, cattr, fattr),
77 Self::V6(v) => v.encode(input, cattr, fattr),
78 }
79 }
80}
81
82
83impl crate::BorrowByteEncode for IpAddr {
84 #[inline]
85 fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
86 match self {
87 Self::V4(v) => v.encode(input, cattr, fattr),
88 Self::V6(v) => v.encode(input, cattr, fattr),
89 }
90 }
91}
92
93
94#[cfg(test)]
95mod test {
96 use crate::{encode::ByteEncode, FieldAttrModifiers};
97 use super::*;
98
99 #[test]
100 fn test_encode_mac_address() {
101 let mut buf = vec![];
102 let value = MacAddress::from_bits(0x1234567890ff);
103 value.encode(&mut buf, None, None);
104 assert_eq!(buf, [0x12, 0x34, 0x56, 0x78, 0x90, 0xff]);
105 assert_eq!(value.to_bits(), 0x1234567890ff);
106 }
107
108 #[test]
109 fn test_encode_ip_address() {
110 let mut buf = vec![];
111 let value = Ipv4Addr::new(0x12, 0x34, 0x56, 0x78);
112 value.encode(&mut buf, None, None);
113 assert_eq!(buf, [0x12, 0x34, 0x56, 0x78]);
114
115 let mut buf = vec![];
116 let value = Ipv4Addr::new(0x12, 0x34, 0x56, 0x78);
117 let fattr = FieldAttrModifiers { byteorder: Some(ByteOrder::Le), ..Default::default() };
118 value.encode(&mut buf, None, Some(&fattr));
119 assert_eq!(buf, [0x78, 0x56, 0x34, 0x12]);
120
121 let mut buf = vec![];
122 let value = IpAddr::V4(Ipv4Addr::new(0x12, 0x34, 0x56, 0x78));
123 let fattr = FieldAttrModifiers { byteorder: Some(ByteOrder::Le), ..Default::default() };
124 value.encode(&mut buf, None, Some(&fattr));
125 assert_eq!(buf, [0x78, 0x56, 0x34, 0x12]);
126 }
127}