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(buf.len()));
24        }
25
26        match self {
27            Vector::U8(value) => {
28                buf[0] = *value;
29            }
30            Vector::U16(value) => {
31                buf[0..2].copy_from_slice(&value.to_be_bytes());
32            }
33            Vector::U32(value) => {
34                buf[0..4].copy_from_slice(&value.to_be_bytes());
35            }
36        };
37
38        Ok(size)
39    }
40}
41
42impl From<u8> for Vector {
43    fn from(value: u8) -> Self {
44        Vector::U8(value)
45    }
46}
47
48impl From<u16> for Vector {
49    fn from(value: u16) -> Self {
50        Vector::U16(value)
51    }
52}
53
54impl From<u32> for Vector {
55    fn from(value: u32) -> Self {
56        Vector::U32(value)
57    }
58}
59
60#[cfg(test)]
61pub mod tests {
62    use super::*;
63
64    #[test]
65    fn test_vector_u8() {
66        let vector = Vector::U8(0x01);
67        let mut buf = [0; 1];
68        assert_eq!(vector.encode(&mut buf).unwrap(), 1);
69        assert_eq!(buf[0], 0x01);
70    }
71
72    #[test]
73    fn test_vector_u16() {
74        let vector = Vector::U16(0x0102);
75        let mut buf = [0; 2];
76        assert_eq!(vector.encode(&mut buf).unwrap(), 2);
77        assert_eq!(buf, [0x01, 0x02]);
78    }
79
80    #[test]
81    fn test_vector_u32() {
82        let vector = Vector::U32(0x01020304);
83        let mut buf = [0; 4];
84        assert_eq!(vector.encode(&mut buf).unwrap(), 4);
85        assert_eq!(buf, [0x01, 0x02, 0x03, 0x04]);
86    }
87}