acn_protocol/
vector.rs

1use crate::error::AcnError;
2
3#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
4pub enum Vector {
5    U8(u8),
6    U16(u16),
7    U32(u32),
8}
9
10impl Vector {
11    pub fn size(&self) -> usize {
12        match self {
13            Vector::U8(_) => 1,
14            Vector::U16(_) => 2,
15            Vector::U32(_) => 4,
16        }
17    }
18
19    pub fn encode(&self, buf: &mut [u8]) -> Result<usize, AcnError> {
20        let size = self.size();
21
22        if buf.len() < size {
23            return Err(AcnError::InvalidBufferLength {
24                actual: buf.len(),
25                expected: size,
26            });
27        }
28
29        match self {
30            Vector::U8(value) => {
31                buf[0] = *value;
32            }
33            Vector::U16(value) => {
34                buf[0..2].copy_from_slice(&value.to_be_bytes());
35            }
36            Vector::U32(value) => {
37                buf[0..4].copy_from_slice(&value.to_be_bytes());
38            }
39        };
40
41        Ok(size)
42    }
43}
44
45impl From<u8> for Vector {
46    fn from(value: u8) -> Self {
47        Vector::U8(value)
48    }
49}
50
51impl From<u16> for Vector {
52    fn from(value: u16) -> Self {
53        Vector::U16(value)
54    }
55}
56
57impl From<u32> for Vector {
58    fn from(value: u32) -> Self {
59        Vector::U32(value)
60    }
61}
62
63#[cfg(test)]
64pub mod tests {
65    use super::*;
66
67    #[test]
68    fn test_vector_u8() {
69        let vector = Vector::U8(0x01);
70        let mut buf = [0; 1];
71        assert_eq!(vector.encode(&mut buf).unwrap(), 1);
72        assert_eq!(buf[0], 0x01);
73    }
74
75    #[test]
76    fn test_vector_u16() {
77        let vector = Vector::U16(0x0102);
78        let mut buf = [0; 2];
79        assert_eq!(vector.encode(&mut buf).unwrap(), 2);
80        assert_eq!(buf, [0x01, 0x02]);
81    }
82
83    #[test]
84    fn test_vector_u32() {
85        let vector = Vector::U32(0x01020304);
86        let mut buf = [0; 4];
87        assert_eq!(vector.encode(&mut buf).unwrap(), 4);
88        assert_eq!(buf, [0x01, 0x02, 0x03, 0x04]);
89    }
90}