hid_report/
reserved.rs

1use std::fmt::Display;
2
3use crate::__data_size;
4
5/// Items that are reserved for future use.
6#[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    /// Create an item with size check.
18    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    /// Create an item without size check.
35    ///
36    /// # Safety
37    ///
38    /// Must ensure that the size part in the prefix is correct.
39    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    /// Get prefix part of the item. Equivalent to `item.as_ref()[0]`.
46    pub fn prefix(&self) -> u8 {
47        self.0[0]
48    }
49
50    /// Get data part of the item. Equivalent to `&item.as_ref()[1..]`.
51    pub fn data(&self) -> &[u8] {
52        let end = __data_size(self.0[0]) + 1;
53        &self.0[1..end]
54    }
55
56    /// Set data part of the item.
57    ///
58    /// *NOTE*: data size must be: 0, 1, 2 or 4.
59    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    /// Get mutable data part of the item.
66    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}