depo_api/request/
update_xid_document.rs1use 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#[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 #[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}