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}