Skip to main content

coil_template/
registry.rs

1use super::*;
2
3#[derive(Debug, Clone, PartialEq, Eq, Default)]
4pub struct TemplateRegistry {
5    templates: BTreeMap<TemplateKey, TemplateDefinition>,
6}
7
8impl TemplateRegistry {
9    pub fn new() -> Self {
10        Self::default()
11    }
12
13    pub fn register(&mut self, template: TemplateDefinition) -> Result<(), TemplateModelError> {
14        if self.templates.contains_key(&template.key) {
15            return Err(TemplateModelError::DuplicateTemplate {
16                key: template.key.clone(),
17            });
18        }
19
20        self.templates.insert(template.key.clone(), template);
21        Ok(())
22    }
23
24    pub(crate) fn resolve(
25        &self,
26        namespaces: &[TemplateNamespace],
27        selector: &TemplateSelector,
28    ) -> Result<&TemplateDefinition, TemplateModelError> {
29        for namespace in namespaces {
30            let key = TemplateKey::new(namespace.clone(), selector.name().clone());
31            if let Some(template) = self.templates.get(&key) {
32                return Ok(template);
33            }
34        }
35
36        Err(TemplateModelError::TemplateNotFound {
37            name: selector.name().clone(),
38        })
39    }
40}