use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::BTreeMap;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Metadata {
fields: BTreeMap<String, Value>,
}
impl Metadata {
pub fn new() -> Self {
Self::default()
}
pub fn insert<V>(&mut self, key: impl Into<String>, value: V)
where
V: Into<Value>,
{
self.fields.insert(key.into(), value.into());
}
pub fn get(&self, key: &str) -> Option<&Value> {
self.fields.get(key)
}
pub fn fields(&self) -> &BTreeMap<String, Value> {
&self.fields
}
pub fn with<V>(mut self, key: impl Into<String>, value: V) -> Self
where
V: Into<Value>,
{
self.insert(key, value);
self
}
}
#[cfg(test)]
mod tests {
use super::Metadata;
#[test]
fn metadata_stores_values() {
let metadata = Metadata::new().with("source", "runbook.md");
assert_eq!(metadata.get("source").unwrap(), "runbook.md");
}
#[test]
fn metadata_insert_and_fields_expose_values() {
let mut metadata = Metadata::new();
metadata.insert("retries", 3);
metadata.insert("enabled", true);
assert_eq!(metadata.get("retries").unwrap(), 3);
assert_eq!(metadata.fields().len(), 2);
assert_eq!(metadata.fields().get("enabled").unwrap(), true);
}
}