1use std::fmt::Display;
2
3use crate::__data_size;
4
5#[derive(Clone, Debug, PartialEq, Eq)]
7pub struct Reserved([u8; 5]);
8
9impl AsRef<[u8]> for Reserved {
10 fn as_ref(&self) -> &[u8] {
11 let end = __data_size(self.0[0]) + 1;
12 &self.0[..end]
13 }
14}
15
16impl Reserved {
17 pub fn new(raw: &[u8]) -> Result<Self, crate::HidError> {
19 if raw.is_empty() {
20 return Err(crate::HidError::EmptyRawInput);
21 };
22 let expected = crate::__data_size(raw[0]);
23 if expected + 1 != raw.len() {
24 return Err(crate::HidError::DataSizeNotMatch {
25 expected,
26 provided: raw.len() - 1,
27 });
28 };
29 let mut storage = [0; 5];
30 storage[..raw.len()].copy_from_slice(raw);
31 Ok(Self(storage))
32 }
33
34 pub unsafe fn new_unchecked(raw: &[u8]) -> Self {
40 let mut storage = [0; 5];
41 storage[..raw.len()].copy_from_slice(raw);
42 Self(storage)
43 }
44
45 pub fn prefix(&self) -> u8 {
47 self.0[0]
48 }
49
50 pub fn data(&self) -> &[u8] {
52 let end = __data_size(self.0[0]) + 1;
53 &self.0[1..end]
54 }
55
56 pub fn set_data(&mut self, data: &[u8]) -> Result<&mut Self, crate::HidError> {
60 crate::__set_data_size(&mut self.0[0], data)?;
61 self.data_mut().copy_from_slice(data);
62 Ok(self)
63 }
64
65 pub fn data_mut(&mut self) -> &mut [u8] {
67 let end = __data_size(self.0[0]) + 1;
68 &mut self.0[1..end]
69 }
70}
71
72impl Display for Reserved {
73 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74 match self.0.len() {
75 1.. => write!(f, "Reserved"),
76 0 => unreachable!(),
77 }
78 }
79}