coil-template 0.1.1

Server-side template parsing and rendering for the Coil framework.
Documentation
use super::*;

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct TemplateRegistry {
    templates: BTreeMap<TemplateKey, TemplateDefinition>,
}

impl TemplateRegistry {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn register(&mut self, template: TemplateDefinition) -> Result<(), TemplateModelError> {
        if self.templates.contains_key(&template.key) {
            return Err(TemplateModelError::DuplicateTemplate {
                key: template.key.clone(),
            });
        }

        self.templates.insert(template.key.clone(), template);
        Ok(())
    }

    pub(crate) fn resolve(
        &self,
        namespaces: &[TemplateNamespace],
        selector: &TemplateSelector,
    ) -> Result<&TemplateDefinition, TemplateModelError> {
        for namespace in namespaces {
            let key = TemplateKey::new(namespace.clone(), selector.name().clone());
            if let Some(template) = self.templates.get(&key) {
                return Ok(template);
            }
        }

        Err(TemplateModelError::TemplateNotFound {
            name: selector.name().clone(),
        })
    }
}