depo_api/request/
update_recovery.rs

1use bc_envelope::prelude::*;
2use anyhow::{ Error, Result };
3
4use crate::{ UPDATE_RECOVERY_FUNCTION, RECOVERY_METHOD_PARAM, util::{ Abbrev, FlankedFunction } };
5
6//
7// Request
8//
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct UpdateRecovery(Option<String>);
12
13impl UpdateRecovery {
14    pub fn new(recovery: Option<String>) -> Self {
15        Self(recovery)
16    }
17
18    pub fn recovery(&self) -> Option<&String> {
19        self.0.as_ref()
20    }
21}
22
23impl From<UpdateRecovery> for Expression {
24    fn from(value: UpdateRecovery) -> Self {
25        let method = if let Some(recovery) = value.0.clone() {
26            recovery.to_envelope()
27        } else {
28            Envelope::null()
29        };
30        Expression::new(UPDATE_RECOVERY_FUNCTION).with_parameter(RECOVERY_METHOD_PARAM, method)
31    }
32}
33
34impl TryFrom<Expression> for UpdateRecovery {
35    type Error = Error;
36
37    fn try_from(expression: Expression) -> Result<Self> {
38        let recovery_object = expression.object_for_parameter(RECOVERY_METHOD_PARAM)?;
39        let recovery = if recovery_object.is_null() {
40            None
41        } else {
42            Some(recovery_object.extract_subject()?)
43        };
44        Ok(Self::new(recovery))
45    }
46}
47
48impl std::fmt::Display for UpdateRecovery {
49    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
50        f.write_fmt(
51            format_args!("{} to {}", "updateRecovery".flanked_function(), self.recovery().abbrev())
52        )
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use indoc::indoc;
59
60    use super::*;
61
62    #[test]
63    fn test_request() {
64        bc_envelope::register_tags();
65
66        let recovery = "recovery".to_string();
67
68        let request = UpdateRecovery::new(Some(recovery));
69        let expression: Expression = request.clone().into();
70        let request_envelope = expression.to_envelope();
71        // println!("{}", request_envelope.format());
72        #[rustfmt::skip]
73        assert_eq!(request_envelope.format(), indoc! {r#"
74            «"updateRecovery"» [
75                ❰"recoveryMethod"❱: "recovery"
76            ]
77        "#}.trim());
78        let decoded_expression = Expression::try_from(request_envelope).unwrap();
79        let decoded = UpdateRecovery::try_from(decoded_expression).unwrap();
80        assert_eq!(request, decoded);
81    }
82}