flexml 0.5.3

Quickly and easily define namespaced XML serialization
Documentation
use std::fmt::Display;

use log::warn;

use crate::{XMLError, XMLNamespace, XMLNamespaces};

#[derive(Debug, Clone)]
pub struct XMLAttribute {
    pub(crate) key: String,
    pub(crate) value: String,
    pub(crate) namespace: Option<XMLNamespace>,
}

impl XMLAttribute {
    pub fn new<T: Display, V: Display>(key: T, value: &V) -> Self {
        Self {
            key: key.to_string(),
            value: value.to_string(),
            namespace: None,
        }
    }

    #[inline]
    pub fn namespace(mut self, namespace: &'static str) -> Result<Self, XMLError> {
        self.set_namespace(namespace)?;
        Ok(self)
    }

    #[inline]
    pub fn set_namespace(&mut self, namespace: &'static str) -> Result<(), XMLError> {
        if let Some(ns) = XMLNamespaces::get(&namespace.to_string())? {
            _ = self.namespace.insert(ns);
        } else {
            warn!("Namespace {namespace} not defined.");
            return Err(XMLError::NamespaceNotFound(namespace.to_string()));
        }
        Ok(())
    }
}