tackler_api/metadata.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
/*
* Copyright 2022 E257.FI
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
//! Txn Set and Report metadata
//!
pub mod items;
use items::MetadataItem;
use items::MetadataItems;
use items::Text;
/// Metadata of Inputs, Txn Set, Reporting parameters, etc.
///
#[derive(Debug, Clone, Default)]
pub struct Metadata {
// todo: fix pub access
#[doc(hidden)]
pub items: MetadataItems,
}
impl Metadata {
/// Get new empty `metadata`
#[must_use]
pub fn new() -> Metadata {
Metadata { items: Vec::new() }
}
/// Get new metadata with existing Metadata item
#[must_use]
pub fn from_mdi(mdi: MetadataItem) -> Metadata {
let items = vec![mdi];
Metadata { items }
}
/// Get new metadata from existing Metadata.
///
/// If there is an existing [`TxnSetChecksum`](items::TxnSetChecksum) metadata item,
/// it will be removed from the new set.
#[must_use]
pub fn from_metadata(md: &Metadata) -> Metadata {
let mut metadata = Metadata::new();
for mdi in &md.items {
match mdi {
MetadataItem::TxnSetChecksum(_) => (),
_ => metadata.push(mdi.clone()),
}
}
metadata
}
/// Add metadata item into metadata
pub fn push(&mut self, mdi: MetadataItem) {
self.items.push(mdi);
}
/// Get textual representation of Metadata
#[must_use]
pub fn text(&self) -> String {
let ts = self
.items
.iter()
.flat_map(|item| {
let mut vs = item.text();
// put a newline between metadata items
vs.push(String::default());
vs
})
.collect::<Vec<String>>();
ts.join("\n")
}
}
/// Generic checksum value
#[derive(Debug, Clone)]
pub struct Checksum {
/// used hash algorithm
pub algorithm: String,
/// hexadecimal hash value
pub value: String,
}