bnr_xfs/status/
hardware.rs

1use std::fmt;
2
3const HARDWARE_OK: u32 = 0;
4const HARDWARE_MISSING: u32 = 1;
5const HARDWARE_NOTIFICATION: u32 = 2;
6const HARDWARE_WARNING: u32 = 3;
7const HARDWARE_ERROR: u32 = 4;
8
9/// Represents the overall status of the CDR hardware.
10#[repr(u32)]
11#[derive(Clone, Copy, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
12pub enum HardwareStatus {
13    #[default]
14    Ok = HARDWARE_OK,
15    Missing = HARDWARE_MISSING,
16    Notification = HARDWARE_NOTIFICATION,
17    Warning = HARDWARE_WARNING,
18    Error = HARDWARE_ERROR,
19}
20
21impl HardwareStatus {
22    /// Creates a new [HardwareStatus].
23    pub const fn new() -> Self {
24        Self::Ok
25    }
26
27    /// Creates a new [HardwareStatus] from the provided parameter.
28    pub const fn create(val: u32) -> Self {
29        match val {
30            HARDWARE_OK => Self::Ok,
31            HARDWARE_MISSING => Self::Missing,
32            HARDWARE_NOTIFICATION => Self::Notification,
33            HARDWARE_WARNING => Self::Warning,
34            HARDWARE_ERROR => Self::Error,
35            _ => Self::Missing,
36        }
37    }
38}
39
40impl From<&[HardwareStatus]> for HardwareStatus {
41    fn from(val: &[HardwareStatus]) -> Self {
42        // start by checking for the "highest" priority status, i.e. status that require the most
43        // attention
44        if val.contains(&Self::Error) {
45            Self::Error
46        } else if val.contains(&Self::Warning) {
47            Self::Warning
48        } else if val.contains(&Self::Missing) {
49            Self::Missing
50        } else if val.contains(&Self::Notification) {
51            Self::Notification
52        } else {
53            Self::Ok
54        }
55    }
56}
57
58impl<const N: usize> From<&[HardwareStatus; N]> for HardwareStatus {
59    fn from(val: &[HardwareStatus; N]) -> Self {
60        val.as_ref().into()
61    }
62}
63
64impl<const N: usize> From<[HardwareStatus; N]> for HardwareStatus {
65    fn from(val: [HardwareStatus; N]) -> Self {
66        val.as_ref().into()
67    }
68}
69
70impl From<HardwareStatus> for &'static str {
71    fn from(val: HardwareStatus) -> Self {
72        match val {
73            HardwareStatus::Ok => "OK",
74            HardwareStatus::Missing => "missing",
75            HardwareStatus::Notification => "notification",
76            HardwareStatus::Warning => "warning",
77            HardwareStatus::Error => "error",
78        }
79    }
80}
81
82impl From<&HardwareStatus> for &'static str {
83    fn from(val: &HardwareStatus) -> Self {
84        (*val).into()
85    }
86}
87
88impl fmt::Display for HardwareStatus {
89    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
90        write!(f, r#""{}""#, <&str>::from(self))
91    }
92}
93
94impl_xfs_enum!(HardwareStatus, "hardwareStatus");