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