dwn_core/message/descriptor/protocols/
configure.rs

1use std::collections::HashMap;
2
3use semver::Version;
4use serde::{Deserialize, Serialize};
5use serde_with::{DisplayFromStr, serde_as, skip_serializing_none};
6
7use crate::message::{
8    Message,
9    cid::CidGenerationError,
10    descriptor::{Descriptor, Interface, Method},
11};
12
13#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
14#[serde(rename_all = "camelCase")]
15pub struct ProtocolsConfigure {
16    interface: Interface,
17    method: Method,
18    pub protocol_version: semver::Version,
19    pub definition: ProtocolDefinition,
20}
21
22#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
23pub struct ProtocolDefinition {
24    pub protocol: String,
25    pub published: bool,
26    pub types: HashMap<String, ProtocolType>,
27    pub structure: HashMap<String, ProtocolStructure>,
28}
29
30#[serde_as]
31#[skip_serializing_none]
32#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
33#[serde(rename_all = "camelCase")]
34pub struct ProtocolType {
35    #[serde_as(as = "Vec<DisplayFromStr>")]
36    pub data_format: Vec<mime::Mime>,
37    pub schema: Option<String>,
38}
39
40#[skip_serializing_none]
41#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
42pub struct ProtocolStructure {
43    #[serde(rename = "$actions")]
44    pub actions: Option<Vec<ProtocolRule>>,
45    #[serde(flatten)]
46    pub children: HashMap<String, ProtocolStructure>,
47}
48
49#[skip_serializing_none]
50#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
51pub struct ProtocolRule {
52    pub who: Who,
53    pub can: Vec<Can>,
54    pub of: Option<String>,
55}
56
57#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
58#[serde(rename_all = "camelCase")]
59pub enum Who {
60    Anyone,
61    Author,
62    Recipient,
63}
64
65#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
66#[serde(rename_all = "camelCase")]
67pub enum Can {
68    Create,
69    Delete,
70    Query,
71    Read,
72    Subscribe,
73    Update,
74}
75
76pub struct ProtocolsConfigureBuilder {
77    version: Version,
78    definition: ProtocolDefinition,
79}
80
81impl ProtocolsConfigureBuilder {
82    pub fn new(version: Version, definition: ProtocolDefinition) -> Self {
83        Self {
84            version,
85            definition,
86        }
87    }
88
89    pub fn build(self) -> Result<Message, CidGenerationError> {
90        let descriptor = Descriptor::ProtocolsConfigure(Box::new(ProtocolsConfigure {
91            interface: Interface::Protocols,
92            method: Method::Configure,
93            protocol_version: self.version,
94            definition: self.definition,
95        }));
96
97        Ok(Message {
98            record_id: descriptor.compute_entry_id()?,
99            context_id: None,
100            data: None,
101            descriptor,
102            attestation: None,
103            authorization: None,
104        })
105    }
106}