bnr_xfs/callback_response/
status.rs

1use std::fmt;
2
3use crate::{create_xfs_i4, impl_xfs_struct};
4
5create_xfs_i4!(
6    CallbackStatus,
7    "status",
8    r#"Represents the identification ID for a particular callback operation.
9
10This uniquely identifies the specific call that was made."#
11);
12
13create_xfs_i4!(
14    CallbackResult,
15    "result",
16    "Represents the result for a particular callback operation."
17);
18
19/// Represents a response to a callback call made by the device.
20#[repr(C)]
21#[derive(Clone, Copy, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
22pub struct CallbackStatusResponse {
23    status: CallbackStatus,
24    result: CallbackResult,
25}
26
27impl CallbackStatusResponse {
28    /// Creates a new [CallbackStatusResponse].
29    pub const fn new() -> Self {
30        Self {
31            status: CallbackStatus::new(),
32            result: CallbackResult::new(),
33        }
34    }
35
36    /// Creates a new [CallbackStatusResponse] from the provided parameters.
37    pub const fn create(status: i32, result: i32) -> Self {
38        Self {
39            status: CallbackStatus::create(status as u32),
40            result: CallbackResult::create(result as u32),
41        }
42    }
43
44    /// Gets the [CallbackStatus] value.
45    pub const fn status(&self) -> u32 {
46        self.status.inner()
47    }
48
49    /// Sets the [CallbackStatus] value.
50    pub fn set_status(&mut self, val: i32) {
51        self.status.set_inner(val as u32);
52    }
53
54    /// Builder function that sets the [CallbackStatus] value.
55    pub fn with_status(mut self, val: i32) -> Self {
56        self.set_status(val);
57        self
58    }
59
60    /// Gets the [CallbackResult] value.
61    pub const fn result(&self) -> u32 {
62        self.result.inner()
63    }
64
65    /// Sets the [CallbackResult] value.
66    pub fn set_result(&mut self, val: i32) {
67        self.result.set_inner(val as u32)
68    }
69
70    /// Builder function that sets the [CallbackResult] value.
71    pub fn with_result(mut self, val: i32) -> Self {
72        self.set_result(val);
73        self
74    }
75}
76
77impl fmt::Display for CallbackStatusResponse {
78    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79        write!(f, "{{")?;
80        write!(f, r#""status": {}, "#, self.status())?;
81        write!(f, r#""result": {}"#, self.result())?;
82        write!(f, "}}")
83    }
84}
85
86impl_xfs_struct!(CallbackStatusResponse, "callbackResponse", [status: CallbackStatus, result: CallbackResult]);
87
88#[cfg(test)]
89mod tests {
90    use super::*;
91
92    use crate::xfs::{
93        self,
94        method_response::{XfsMethodResponse, XfsMethodResponseStruct},
95        params::XfsParam,
96    };
97    use crate::Result;
98
99    #[test]
100    fn test_callback_response_serde() -> Result<()> {
101        let exp_xml = r#"<?xml version="1.0" encoding="ISO-8859-1"?><methodResponse><params><param><value><struct><member><name>status</name><value><i4>6192</i4></value></member><member><name>result</name><value><i4>-1</i4></value></member></struct></value></param></params></methodResponse>"#;
102        let exp_res =
103            XfsMethodResponseStruct::new(XfsMethodResponse::new_params([XfsParam::create(
104                CallbackStatusResponse::create(6192, -1).into(),
105            )]));
106
107        assert_eq!(xfs::to_iso_string(&exp_res)?.as_str(), exp_xml);
108        assert_eq!(xfs::from_str::<XfsMethodResponseStruct>(exp_xml)?, exp_res);
109
110        Ok(())
111    }
112}