bnr_xfs/status/
dispenser.rs

1use std::fmt;
2
3use super::HardwareStatus;
4
5pub const CASH_UNIT_CHANGED: u32 = 6153;
6pub const CASH_UNIT_CONFIG_CHANGED: u32 = 6154;
7pub const CASH_UNIT_THRESHOLD: u32 = 6155;
8pub const CASH_UNIT_OK: u32 = 6181;
9pub const CASH_UNIT_STATE: u32 = 6182;
10pub const CASH_UNIT_STOP: u32 = 6183;
11pub const CASH_UNIT_UNKNOWN: u32 = 6184;
12pub const CASH_TAKEN: u32 = 6192;
13pub const CASH_AVAILABLE: u32 = 6223;
14
15/// Represents CDR dispenser status values.
16#[repr(u32)]
17#[derive(Clone, Copy, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
18pub enum DispenserStatus {
19    /// Cash unit changed
20    Changed = CASH_UNIT_CHANGED,
21    /// Cash unit configuration changed
22    ConfigChanged = CASH_UNIT_CONFIG_CHANGED,
23    /// Cash unit threshold reached
24    Threshold = CASH_UNIT_THRESHOLD,
25    /// Indicates the cash unit is OK
26    Ok = CASH_UNIT_OK,
27    /// Indicates a cash unit state event
28    State = CASH_UNIT_STATE,
29    /// Indicates a cash unit stop event
30    Stop = CASH_UNIT_STOP,
31    /// Indicates an unknown cash unit event
32    #[default]
33    Unknown = CASH_UNIT_UNKNOWN,
34    /// Cash taken
35    CashTaken = CASH_TAKEN,
36    /// Cash available
37    CashAvailable = CASH_AVAILABLE,
38}
39
40impl DispenserStatus {
41    /// Creates a new [DispenserStatus].
42    pub const fn new() -> Self {
43        Self::Unknown
44    }
45
46    /// Creates a new [DispenserStatus] from the provided parameter.
47    pub const fn create(val: u32) -> Self {
48        match val {
49            CASH_UNIT_CHANGED => Self::Changed,
50            CASH_UNIT_CONFIG_CHANGED => Self::ConfigChanged,
51            CASH_UNIT_THRESHOLD => Self::Threshold,
52            CASH_UNIT_OK => Self::Ok,
53            CASH_UNIT_STATE => Self::State,
54            CASH_UNIT_STOP => Self::Stop,
55            CASH_UNIT_UNKNOWN => Self::Unknown,
56            CASH_TAKEN => Self::CashTaken,
57            CASH_AVAILABLE => Self::CashAvailable,
58            _ => Self::Unknown,
59        }
60    }
61}
62
63impl From<DispenserStatus> for HardwareStatus {
64    fn from(val: DispenserStatus) -> Self {
65        match val {
66            DispenserStatus::Ok => Self::Ok,
67            DispenserStatus::Changed
68            | DispenserStatus::ConfigChanged
69            | DispenserStatus::CashAvailable
70            | DispenserStatus::CashTaken
71            | DispenserStatus::State => Self::Notification,
72            DispenserStatus::Threshold | DispenserStatus::Stop | DispenserStatus::Unknown => {
73                Self::Warning
74            }
75        }
76    }
77}
78
79impl From<DispenserStatus> for &'static str {
80    fn from(val: DispenserStatus) -> Self {
81        match val {
82            DispenserStatus::Changed => "changed",
83            DispenserStatus::ConfigChanged => "configuration changed",
84            DispenserStatus::Threshold => "threshold",
85            DispenserStatus::CashAvailable => "cash available",
86            DispenserStatus::CashTaken => "cash taken",
87            DispenserStatus::State => "state",
88            DispenserStatus::Stop => "stop",
89            DispenserStatus::Unknown => "unknown",
90            DispenserStatus::Ok => "OK",
91        }
92    }
93}
94
95impl From<&DispenserStatus> for &'static str {
96    fn from(val: &DispenserStatus) -> Self {
97        (*val).into()
98    }
99}
100
101impl fmt::Display for DispenserStatus {
102    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103        write!(f, "{}", <&str>::from(self))
104    }
105}
106
107impl_xfs_enum!(DispenserStatus, "dispenserStatus");