fierros-core 1.0.0

Provider-neutral core primitives for Fierros
Documentation
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);
    }
}