1pub mod items;
9
10use items::MetadataItem;
11use items::MetadataItems;
12use items::Text;
13use jiff::tz::TimeZone;
14use serde::Serialize;
15
16#[derive(Serialize, Debug, Clone, Default)]
19pub struct Metadata {
20 #[doc(hidden)]
22 pub items: MetadataItems,
23}
24
25impl Metadata {
26 #[must_use]
28 pub fn new() -> Metadata {
29 Metadata { items: Vec::new() }
30 }
31
32 #[must_use]
34 pub fn from_mdi(mdi: MetadataItem) -> Metadata {
35 let items = vec![mdi];
36
37 Metadata { items }
38 }
39
40 #[must_use]
45 pub fn from_metadata(md: &Metadata) -> Metadata {
46 let mut metadata = Metadata::new();
47 for mdi in &md.items {
48 match mdi {
49 MetadataItem::TxnSetChecksum(_) => (),
50 _ => metadata.push(mdi.clone()),
51 }
52 }
53 metadata
54 }
55
56 pub fn push(&mut self, mdi: MetadataItem) {
58 self.items.push(mdi);
59 }
60
61 #[must_use]
63 pub fn text(&self, tz: TimeZone) -> String {
64 let ts = self
65 .items
66 .iter()
67 .flat_map(|item| {
68 let mut vs = item.text(tz.clone());
69 vs.push(String::default());
71 vs
72 })
73 .collect::<Vec<String>>();
74 ts.join("\n")
75 }
76
77 pub fn is_empty(&self) -> bool {
79 self.items.is_empty()
80 }
81}
82
83#[derive(Serialize, Debug, Clone)]
85pub struct Checksum {
86 pub algorithm: String,
88 pub value: String,
90}