1use std::fmt;
4
5use crate::xfs::{method_response::XfsMethodResponse, params::XfsParam};
6use crate::{impl_xfs_struct, Error, Result};
7
8mod content;
9mod device;
10mod dispenser;
11mod hardware;
12mod inter_stacker;
13mod position;
14mod position_capabilities;
15mod position_status;
16mod safe_door;
17mod shutter;
18mod transport;
19
20pub use content::*;
21pub use device::*;
22pub use dispenser::*;
23pub use hardware::*;
24pub use inter_stacker::*;
25pub use position::*;
26pub use position_capabilities::*;
27pub use position_status::*;
28pub use safe_door::*;
29pub use shutter::*;
30pub use transport::*;
31
32#[repr(C)]
35#[derive(Clone, Copy, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
36pub struct CdrStatus {
37 pub device_status: DeviceStatus,
38 pub dispenser_status: DispenserStatus,
39 pub intermediate_stacker_status: IntermediateStackerStatus,
40 pub safe_door_status: SafeDoorStatus,
41 pub shutter_status: ShutterStatus,
42 pub transport_status: TransportStatus,
43 pub position_status_list: CdrPositionStatusList,
44}
45
46impl CdrStatus {
47 pub const fn new() -> Self {
49 Self {
50 device_status: DeviceStatus::new(),
51 dispenser_status: DispenserStatus::new(),
52 intermediate_stacker_status: IntermediateStackerStatus::new(),
53 safe_door_status: SafeDoorStatus::new(),
54 shutter_status: ShutterStatus::new(),
55 transport_status: TransportStatus::new(),
56 position_status_list: CdrPositionStatusList::new(),
57 }
58 }
59}
60
61impl From<CdrStatus> for HardwareStatus {
62 fn from(val: CdrStatus) -> Self {
63 [
64 HardwareStatus::from(val.device_status),
65 HardwareStatus::from(val.dispenser_status),
66 HardwareStatus::from(val.intermediate_stacker_status),
67 HardwareStatus::from(val.safe_door_status),
68 HardwareStatus::from(val.shutter_status),
69 HardwareStatus::from(val.transport_status),
70 HardwareStatus::from(val.position_status_list),
71 ]
72 .into()
73 }
74}
75
76impl_xfs_struct!(
77 CdrStatus,
78 "status",
79 [
80 device_status: DeviceStatus,
81 dispenser_status: DispenserStatus,
82 intermediate_stacker_status: IntermediateStackerStatus,
83 safe_door_status: SafeDoorStatus,
84 shutter_status: ShutterStatus,
85 transport_status: TransportStatus,
86 position_status_list: CdrPositionStatusList
87 ]
88);
89
90impl From<&CdrStatus> for XfsParam {
91 fn from(val: &CdrStatus) -> Self {
92 Self::create(val.into())
93 }
94}
95
96impl From<CdrStatus> for XfsParam {
97 fn from(val: CdrStatus) -> Self {
98 (&val).into()
99 }
100}
101
102impl TryFrom<&XfsParam> for CdrStatus {
103 type Error = Error;
104
105 fn try_from(val: &XfsParam) -> Result<Self> {
106 val.value().try_into()
107 }
108}
109
110impl TryFrom<XfsParam> for CdrStatus {
111 type Error = Error;
112
113 fn try_from(val: XfsParam) -> Result<Self> {
114 (&val).try_into()
115 }
116}
117
118impl TryFrom<&XfsMethodResponse> for CdrStatus {
119 type Error = Error;
120
121 fn try_from(val: &XfsMethodResponse) -> Result<Self> {
122 val.as_params()?
123 .params()
124 .iter()
125 .map(|p| p.inner())
126 .find(|p| p.value().xfs_struct().is_some())
127 .ok_or(Error::Xfs(format!(
128 "Expected CdrStatus XfsMethodResponse, have: {val}"
129 )))?
130 .try_into()
131 }
132}
133
134impl TryFrom<XfsMethodResponse> for CdrStatus {
135 type Error = Error;
136
137 fn try_from(val: XfsMethodResponse) -> Result<Self> {
138 (&val).try_into()
139 }
140}
141
142impl fmt::Display for CdrStatus {
143 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
144 write!(f, r#"{{"device_status": "{}","#, self.device_status)?;
145 write!(f, r#" "dispenser_status": "{}","#, self.dispenser_status)?;
146 write!(
147 f,
148 r#" "intermediate_stacker_status": "{}","#,
149 self.intermediate_stacker_status
150 )?;
151 write!(f, r#" "safe_door_status": "{}","#, self.safe_door_status)?;
152 write!(f, r#" "shutter_status": "{}","#, self.shutter_status)?;
153 write!(f, r#" "transport_status": "{}","#, self.transport_status)?;
154 write!(
155 f,
156 r#" "position_status_list": {}}}"#,
157 self.position_status_list
158 )
159 }
160}