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 #[allow(clippy::needless_pass_by_value)]
64 pub fn text(&self, tz: TimeZone) -> String {
65 let ts = self
66 .items
67 .iter()
68 .flat_map(|item| {
69 let mut vs = item.text(tz.clone());
70 vs.push(String::default());
72 vs
73 })
74 .collect::<Vec<String>>();
75 ts.join("\n")
76 }
77
78 #[must_use]
80 pub fn is_empty(&self) -> bool {
81 self.items.is_empty()
82 }
83}
84
85#[derive(Serialize, Debug, Clone)]
87pub struct Checksum {
88 pub algorithm: String,
90 pub value: String,
92}