coil_template/
registry.rs1use 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}