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}