keri_core/event/sections/
seal.rs

1use 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    // Debug,
69    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        // Just forward to Display
115        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    // Event seal
183    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    // Location seal
189    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    // Digest seal
195    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}