trouble_host/types/
capabilities.rs

1use crate::Error;
2
3/// Device I/O capabilities
4// ([Vol 3] Part H, Section 2.3.2).
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum IoCapabilities {
7    /// Display only
8    DisplayOnly,
9    /// Yes/no display
10    DisplayYesNo,
11    /// Keyboard only
12    KeyboardOnly,
13    /// No input and no output
14    NoInputNoOutput,
15    /// Both keyboard and display
16    KeyboardDisplay,
17}
18
19impl TryFrom<u8> for IoCapabilities {
20    type Error = Error;
21    fn try_from(val: u8) -> Result<Self, Error> {
22        Ok(match val {
23            0x00 => Self::DisplayOnly,
24            0x01 => Self::DisplayYesNo,
25            0x02 => Self::KeyboardOnly,
26            0x03 => Self::NoInputNoOutput,
27            0x04 => Self::KeyboardDisplay,
28            _ => return Err(Error::InvalidValue),
29        })
30    }
31}
32
33impl From<IoCapabilities> for u8 {
34    fn from(val: IoCapabilities) -> u8 {
35        match val {
36            IoCapabilities::DisplayOnly => 0x00,
37            IoCapabilities::DisplayYesNo => 0x01,
38            IoCapabilities::KeyboardOnly => 0x02,
39            IoCapabilities::NoInputNoOutput => 0x03,
40            IoCapabilities::KeyboardDisplay => 0x04,
41        }
42    }
43}
44
45impl AsRef<str> for IoCapabilities {
46    fn as_ref(&self) -> &str {
47        match self {
48            IoCapabilities::DisplayOnly => "Display Only",
49            IoCapabilities::DisplayYesNo => "Display Yes/No",
50            IoCapabilities::KeyboardOnly => "Keyboard Only",
51            IoCapabilities::NoInputNoOutput => "No Input / No Output",
52            IoCapabilities::KeyboardDisplay => "Keyboard and Display",
53        }
54    }
55}
56
57impl core::fmt::Display for IoCapabilities {
58    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
59        write!(f, "{}", self.as_ref())
60    }
61}
62
63#[cfg(feature = "defmt")]
64impl defmt::Format for IoCapabilities {
65    fn format(&self, fmt: defmt::Formatter) {
66        defmt::write!(fmt, "{}", self.as_ref())
67    }
68}