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)
}
}
pub struct RegistryBase {
pub handlebars: Handlebars<'static>,
pub presets: BTreeMap<String, PresetInfo>,
pub themes: ThemeRegistry,
pub primitives_manifest: PrimitivesManifest,
pub categories: Vec<Category>,
}