depo_api/request/
start_recovery.rs

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