jppe/encode/
impls_address.rs

1use 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}