jppe 1.1.1

This is a byte stream structured serialization and deserialization library.
Documentation
use crate::std::*;
use crate::fields::MacAddress;
use crate::{ByteOrder, get_byteorder};


impl crate::ByteEncode for MacAddress {
    #[inline]
    fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, _fattr: Option<&crate::FieldAttrModifiers>) {        
        input.extend_from_slice(self);
    }
}


impl crate::BorrowByteEncode for MacAddress {
    #[inline]
    fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, _fattr: Option<&crate::FieldAttrModifiers>) {
        input.extend_from_slice(self);
    }
}


impl crate::ByteEncode for Ipv4Addr {
    #[inline]
    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {        
        let byteorder = get_byteorder(cattr, fattr);

        if byteorder == ByteOrder::Be {
            input.extend(self.octets());            
        }
        else {
            let mut value = self.octets();
            value.reverse();
            input.extend(value);
        }
    }
}


impl crate::BorrowByteEncode for Ipv4Addr {
    #[inline]
    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
        crate::ByteEncode::encode(self, input, cattr, fattr)
    }
}


impl crate::ByteEncode for Ipv6Addr {
    #[inline]
    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {        
        let byteorder = get_byteorder(cattr, fattr);

        if byteorder == ByteOrder::Be {
            input.extend(self.octets());            
        }
        else {
            let mut value = self.octets();
            value.reverse();
            input.extend(value);
        }
    }
}


impl crate::BorrowByteEncode for Ipv6Addr {
    #[inline]
    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
        crate::ByteEncode::encode(self, input, cattr, fattr)
    }
}


impl crate::ByteEncode for IpAddr {
    #[inline]
    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {        
        match self {
            Self::V4(v) => v.encode(input, cattr, fattr),
            Self::V6(v) => v.encode(input, cattr, fattr),
        }
    }
}


impl crate::BorrowByteEncode for IpAddr {
    #[inline]
    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
        match self {
            Self::V4(v) => v.encode(input, cattr, fattr),
            Self::V6(v) => v.encode(input, cattr, fattr),
        }
    }
}


#[cfg(test)]
mod test {
    use crate::{encode::ByteEncode, FieldAttrModifiers};
    use super::*;

    #[test]
    fn test_encode_mac_address() {
        let mut buf = vec![];
        let value = MacAddress::from_bits(0x1234567890ff);
        value.encode(&mut buf, None, None);
        assert_eq!(buf, [0x12, 0x34, 0x56, 0x78, 0x90, 0xff]);
        assert_eq!(value.to_bits(), 0x1234567890ff);
    }

    #[test]
    fn test_encode_ip_address() {
        let mut buf = vec![];
        let value = Ipv4Addr::new(0x12, 0x34, 0x56, 0x78);
        value.encode(&mut buf, None, None);
        assert_eq!(buf, [0x12, 0x34, 0x56, 0x78]);

        let mut buf = vec![];
        let value = Ipv4Addr::new(0x12, 0x34, 0x56, 0x78);
        let fattr = FieldAttrModifiers { byteorder: Some(ByteOrder::Le), ..Default::default() };
        value.encode(&mut buf, None, Some(&fattr));
        assert_eq!(buf, [0x78, 0x56, 0x34, 0x12]);

        let mut buf = vec![];
        let value = IpAddr::V4(Ipv4Addr::new(0x12, 0x34, 0x56, 0x78));
        let fattr = FieldAttrModifiers { byteorder: Some(ByteOrder::Le), ..Default::default() };
        value.encode(&mut buf, None, Some(&fattr));
        assert_eq!(buf, [0x78, 0x56, 0x34, 0x12]);
    }
}