microledger/
seal_bundle.rs1use 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}