depo_api/request/
update_xid_document.rs

1use anyhow::{Error, Result};
2use bc_components::XIDProvider;
3use bc_envelope::prelude::*;
4use bc_xid::XIDDocument;
5
6use crate::{
7    NEW_XID_DOCUMENT_PARAM, UPDATE_XID_DOCUMENT_FUNCTION, util::FlankedFunction,
8};
9
10//
11// Request
12//
13
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct UpdateXIDDocument(XIDDocument);
16
17impl UpdateXIDDocument {
18    pub fn new(new_xid_document: XIDDocument) -> Self { Self(new_xid_document) }
19
20    pub fn new_xid_document(&self) -> &XIDDocument { &self.0 }
21}
22
23impl From<UpdateXIDDocument> for Expression {
24    fn from(value: UpdateXIDDocument) -> Self {
25        Expression::new(UPDATE_XID_DOCUMENT_FUNCTION)
26            .with_parameter(NEW_XID_DOCUMENT_PARAM, value.0)
27    }
28}
29
30impl TryFrom<Expression> for UpdateXIDDocument {
31    type Error = Error;
32
33    fn try_from(expression: Expression) -> Result<Self> {
34        let new_xid_document = XIDDocument::try_from(
35            expression.object_for_parameter(NEW_XID_DOCUMENT_PARAM)?,
36        )?;
37        Ok(Self::new(new_xid_document))
38    }
39}
40
41impl std::fmt::Display for UpdateXIDDocument {
42    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43        f.write_fmt(format_args!(
44            "{} new {}",
45            "updateXIDDocument".flanked_function(),
46            self.new_xid_document().xid()
47        ))
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use bc_components::{PrivateKeyBase, PublicKeysProvider};
54    use bc_rand::make_fake_random_number_generator;
55    use indoc::indoc;
56
57    use super::*;
58
59    #[test]
60    fn test_request() {
61        bc_envelope::register_tags();
62
63        let mut rng = make_fake_random_number_generator();
64        let new_xid_document: XIDDocument =
65            PrivateKeyBase::new_using(&mut rng).public_keys().into();
66
67        let request = UpdateXIDDocument::new(new_xid_document);
68        let expression: Expression = request.clone().into();
69        let request_envelope = expression.to_envelope();
70        // println!("{}", request_envelope.format());
71        #[rustfmt::skip]
72        assert_eq!(request_envelope.format(), indoc! {r#"
73            «"updateXIDDocument"» [
74                ❰"newXIDDocument"❱: XID(71274df1) [
75                    'key': PublicKeys(eb9b1cae) [
76                        'allow': 'All'
77                    ]
78                ]
79            ]
80        "#}.trim());
81        let decoded_expression =
82            Expression::try_from(request_envelope).unwrap();
83        let decoded = UpdateXIDDocument::try_from(decoded_expression).unwrap();
84        assert_eq!(request, decoded);
85    }
86}