greentic-flow-builder 0.1.0

AI-powered Adaptive Card flow builder with visual graph editor and demo runner
Documentation
//! Template registry: load built-in + external, provide lookup API.

mod builtin;
mod external;
mod merge;

pub use builtin::load_builtin;
pub use external::{ExternalPack, load_external_pack};
pub use merge::merge_pack_into_registry;

use crate::discovery::{KeywordDiscovery, TemplateDiscovery};
use crate::template::{Category, PresetInfo, PrimitivesManifest, Theme};
use crate::theme::ThemeRegistry;
use handlebars::Handlebars;
use std::collections::BTreeMap;
use std::path::Path;
use std::sync::Arc;

pub struct TemplateRegistry {
    pub handlebars: Handlebars<'static>,
    pub presets: BTreeMap<String, PresetInfo>,
    pub themes: ThemeRegistry,
    pub primitives_manifest: PrimitivesManifest,
    pub categories: Vec<Category>,
    pub discovery: Arc<dyn TemplateDiscovery>,
}

impl TemplateRegistry {
    pub fn load(external_packs: &[impl AsRef<Path>]) -> anyhow::Result<Self> {
        let mut base = load_builtin()?;
        for pack_path in external_packs {
            let pack = load_external_pack(pack_path.as_ref())?;
            merge_pack_into_registry(&mut base, pack)?;
        }
        let discovery: Arc<dyn TemplateDiscovery> =
            Arc::new(KeywordDiscovery::new(base.presets.clone()));
        Ok(Self {
            handlebars: base.handlebars,
            presets: base.presets,
            themes: base.themes,
            primitives_manifest: base.primitives_manifest,
            categories: base.categories,
            discovery,
        })
    }

    pub fn get_preset(&self, name: &str) -> Option<&PresetInfo> {
        self.presets.get(name)
    }

    pub fn get_theme(&self, name: Option<&str>) -> anyhow::Result<Theme> {
        self.themes.resolve(name)
    }
}

/// Internal struct used during loading before discovery is built.
pub struct RegistryBase {
    pub handlebars: Handlebars<'static>,
    pub presets: BTreeMap<String, PresetInfo>,
    pub themes: ThemeRegistry,
    pub primitives_manifest: PrimitivesManifest,
    pub categories: Vec<Category>,
}