keri_core/event/sections/
seal.rs1use std::fmt::{self, Display};
2
3use crate::{database::redb::rkyv_adapter::said_wrapper::SaidValue, prefix::IdentifierPrefix};
4use said::SelfAddressingIdentifier;
5use serde::{Deserialize, Serialize};
6use serde_hex::{Compact, SerHex};
7
8#[derive(
9 Serialize,
10 Deserialize,
11 Debug,
12 Clone,
13 PartialEq,
14 rkyv::Archive,
15 rkyv::Serialize,
16 rkyv::Deserialize,
17)]
18#[rkyv(derive(Debug))]
19#[serde(untagged)]
20pub enum Seal {
21 Location(LocationSeal),
22 Event(EventSeal),
23 Digest(DigestSeal),
24 Root(RootSeal),
25}
26
27#[derive(
28 Serialize,
29 Deserialize,
30 Debug,
31 Clone,
32 PartialEq,
33 rkyv::Archive,
34 rkyv::Serialize,
35 rkyv::Deserialize,
36)]
37#[rkyv(derive(Debug))]
38pub struct DigestSeal {
39 #[serde(rename = "d")]
40 dig: SaidValue,
41}
42
43impl DigestSeal {
44 pub fn new(said: SelfAddressingIdentifier) -> Self {
45 Self { dig: said.into() }
46 }
47}
48
49#[derive(
50 Serialize,
51 Deserialize,
52 Debug,
53 Clone,
54 PartialEq,
55 rkyv::Archive,
56 rkyv::Serialize,
57 rkyv::Deserialize,
58)]
59#[rkyv(derive(Debug))]
60pub struct RootSeal {
61 #[serde(rename = "rd")]
62 tree_root: SaidValue,
63}
64
65#[derive(
66 Serialize,
67 Deserialize,
68 Clone,
70 Default,
71 PartialEq,
72 rkyv::Archive,
73 rkyv::Serialize,
74 rkyv::Deserialize,
75)]
76#[rkyv(derive(Debug))]
77pub struct EventSeal {
78 #[serde(rename = "i")]
79 pub prefix: IdentifierPrefix,
80
81 #[serde(rename = "s", with = "SerHex::<Compact>")]
82 pub sn: u64,
83
84 #[serde(rename = "d")]
85 event_digest: SaidValue,
86}
87
88impl EventSeal {
89 pub fn new(
90 identifier: IdentifierPrefix,
91 sn: u64,
92 event_digest: SelfAddressingIdentifier,
93 ) -> Self {
94 Self {
95 prefix: identifier,
96 sn,
97 event_digest: event_digest.into(),
98 }
99 }
100
101 pub fn event_digest(&self) -> SelfAddressingIdentifier {
102 self.event_digest.said.clone()
103 }
104}
105
106impl Display for EventSeal {
107 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
108 write!(f, "{}", serde_json::to_string(self).unwrap())
109 }
110}
111
112impl fmt::Debug for EventSeal {
113 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
114 write!(f, "{}", self)
116 }
117}
118
119#[derive(
120 Serialize,
121 Deserialize,
122 Debug,
123 Clone,
124 Default,
125 PartialEq,
126 rkyv::Archive,
127 rkyv::Serialize,
128 rkyv::Deserialize,
129)]
130#[rkyv(derive(Debug))]
131pub struct LocationSeal {
132 #[serde(rename = "i")]
133 pub prefix: IdentifierPrefix,
134
135 #[serde(rename = "s", with = "SerHex::<Compact>")]
136 pub sn: u64,
137
138 #[serde(rename = "t")]
139 pub ilk: String,
140
141 #[serde(rename = "p")]
142 prior_digest: SaidValue,
143}
144
145#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
146pub struct DelegatingEventSeal {
147 #[serde(rename = "i")]
148 pub prefix: IdentifierPrefix,
149
150 #[serde(rename = "d")]
151 pub commitment: SelfAddressingIdentifier,
152}
153
154#[derive(
155 Serialize,
156 Deserialize,
157 Debug,
158 Clone,
159 PartialEq,
160 rkyv::Archive,
161 rkyv::Serialize,
162 rkyv::Deserialize,
163)]
164#[rkyv(derive(Debug))]
165
166pub struct SourceSeal {
167 pub sn: u64,
168 pub digest: SaidValue,
169}
170
171impl SourceSeal {
172 pub fn new(sn: u64, digest: SelfAddressingIdentifier) -> Self {
173 Self {
174 sn,
175 digest: digest.into(),
176 }
177 }
178}
179
180#[test]
181fn test_seal_deserialization() {
182 let seal_str = r#"{"i":"EBfxc4RiVY6saIFmUfEtETs1FcqmktZW88UkbnOg0Qen","s":"1","d":"EN8l6yJC2PxribTN0xfri6bLz34Qvj-x3cNwcV3DvT2m"}"#;
184 let seal: Seal = serde_json::from_str(seal_str).unwrap();
185 assert!(matches!(seal, Seal::Event(_)));
186 assert_eq!(serde_json::to_string(&seal).unwrap(), seal_str);
187
188 let seal_str = r#"{"i":"EBfxc4RiVY6saIFmUfEtETs1FcqmktZW88UkbnOg0Qen","s":"1","t":"ixn","p":"EN8l6yJC2PxribTN0xfri6bLz34Qvj-x3cNwcV3DvT2m"}"#;
190 let seal: Seal = serde_json::from_str(seal_str).unwrap();
191 assert!(matches!(seal, Seal::Location(_)));
192 assert_eq!(serde_json::to_string(&seal).unwrap(), seal_str);
193
194 let seal_str = r#"{"d":"EBfxc4RiVY6saIFmUfEtETs1FcqmktZW88UkbnOg0Qen"}"#;
196 let seal: Seal = serde_json::from_str(seal_str).unwrap();
197 assert!(matches!(seal, Seal::Digest(_)));
198 assert_eq!(serde_json::to_string(&seal).unwrap(), seal_str);
199}