jppe/encode/
impls_hex.rs

1use crate::std::*;
2use crate::fields::{HexString, HexBytes};
3use crate::{get_byteorder, int_to_vec};
4
5
6#[inline]
7fn decode_hex(input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>, length: usize) {
8    if let Some(fr) = fattr {
9        if let Some(byte_count) = fr.byte_count {
10            input.extend(int_to_vec(length, byte_count, &get_byteorder(cattr, fattr)));
11        }
12    }
13    else {
14        input.extend(int_to_vec(length, 1, &crate::ByteOrder::Be));
15    }
16}
17
18
19impl crate::ByteEncode for HexString {
20    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {        
21        decode_hex(input, cattr, fattr, self.len());
22        input.extend_from_slice(self);
23    }
24}
25
26
27impl crate::BorrowByteEncode for HexString {
28    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
29        decode_hex(input, cattr, fattr, self.len());
30        input.extend_from_slice(self);
31    }
32}
33
34
35impl<'da> crate::BorrowByteEncode for HexBytes<'da> {
36    fn encode(&self, input: &mut Vec<u8>, cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>) {
37        decode_hex(input, cattr, fattr, self.len());
38        input.extend_from_slice(self);
39    }
40}
41
42
43#[cfg(test)]
44mod tests {
45    use std::str::FromStr;
46    use crate::ByteEncode;
47    use crate::FieldAttrModifiers;
48    use super::*;
49
50    #[test]
51    fn test_encode_hex() {
52        let value = HexString::from_str("000102").unwrap();
53        let mut buf = Vec::new();
54        value.encode(&mut buf, None, None);
55        assert_eq!(buf, b"\x03\x00\x01\x02");
56
57        let fattr = FieldAttrModifiers { length: Some(3), ..Default::default() };
58        let value = HexString::from_str("000102").unwrap();
59        let mut buf = Vec::new();
60        value.encode(&mut buf, None, Some(&fattr));
61        assert_eq!(buf, b"\x00\x01\x02");
62
63        let fattr = FieldAttrModifiers { byte_count: Some(1), ..Default::default() };
64        let value = HexString::from_str("000102").unwrap();
65        let mut buf = Vec::new();
66        value.encode(&mut buf, None, Some(&fattr));
67        assert_eq!(buf, b"\x03\x00\x01\x02");
68    }
69}