dwn_core/message/descriptor/protocols/
configure.rs1use 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}