depo_api/request/
start_recovery.rs1use bc_envelope::prelude::*;
2use anyhow::{ Error, Result };
3
4use crate::{ RECOVERY_METHOD_PARAM, START_RECOVERY_FUNCTION, util::{ Abbrev, FlankedFunction } };
5
6#[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 #[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}