microledger/
seal_bundle.rs

1use said::derivation::SelfAddressing;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5use crate::seals::Seal;
6
7#[derive(Clone)]
8pub enum SealData {
9    AttachedData(String),
10}
11
12impl SealData {
13    pub fn fingerprint(&self) -> Seal {
14        match self {
15            SealData::AttachedData(data) => {
16                Seal::Attached(SelfAddressing::Blake3_256.derive(data.as_bytes()))
17            }
18        }
19    }
20}
21
22#[derive(Default)]
23pub struct SealBundle {
24    pub seals: Vec<SealData>,
25}
26
27impl SealBundle {
28    pub fn new() -> Self {
29        Self { seals: vec![] }
30    }
31
32    pub fn attach(&self, seal_data: SealData) -> Self {
33        let mut seals = self.seals.clone();
34        seals.push(seal_data);
35        Self { seals }
36    }
37
38    pub fn get_fingerprints(&self) -> Vec<Seal> {
39        self.seals.iter().map(|s| s.fingerprint()).collect()
40    }
41
42    pub fn get_attachement(&self) -> BlockAttachment {
43        let mut hm = HashMap::new();
44        let _filtered_seals = self.seals.iter().for_each(|s| match s {
45            SealData::AttachedData(data) => {
46                hm.insert(s.fingerprint().fingerprint(), data.to_string());
47            }
48        });
49        BlockAttachment { attachements: hm }
50    }
51}
52
53#[derive(Clone, Serialize, Deserialize, Debug, Default)]
54pub struct BlockAttachment {
55    attachements: HashMap<String, String>,
56}
57
58impl BlockAttachment {
59    pub fn new() -> Self {
60        Self {
61            attachements: HashMap::new(),
62        }
63    }
64
65    pub fn get(&self, digest: &str) -> Option<String> {
66        self.attachements.get(digest).map(|s| s.to_string())
67    }
68
69    pub fn to_seal_bundle(&self) -> SealBundle {
70        self.attachements.iter().fold(SealBundle::new(), |acc, v| {
71            acc.attach(SealData::AttachedData(v.1.clone()))
72        })
73    }
74}