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}