systemprompt-templates 0.1.18

Template registry and management for systemprompt.io
Documentation
use systemprompt_template_provider::{
    DynComponentRenderer, DynPageDataProvider, DynPagePrerenderer, DynTemplateDataExtender,
    DynTemplateLoader, DynTemplateProvider,
};

use crate::{TemplateError, TemplateRegistry};

#[derive(Default)]
pub struct TemplateRegistryBuilder {
    providers: Vec<DynTemplateProvider>,
    loaders: Vec<DynTemplateLoader>,
    extenders: Vec<DynTemplateDataExtender>,
    components: Vec<DynComponentRenderer>,
    page_providers: Vec<DynPageDataProvider>,
    page_prerenderers: Vec<DynPagePrerenderer>,
}

impl std::fmt::Debug for TemplateRegistryBuilder {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("TemplateRegistryBuilder")
            .field("providers", &self.providers.len())
            .field("loaders", &self.loaders.len())
            .field("extenders", &self.extenders.len())
            .field("components", &self.components.len())
            .field("page_providers", &self.page_providers.len())
            .field("page_prerenderers", &self.page_prerenderers.len())
            .finish()
    }
}

impl TemplateRegistryBuilder {
    #[must_use]
    pub fn new() -> Self {
        Self::default()
    }

    #[must_use]
    pub fn with_provider(mut self, provider: impl Into<DynTemplateProvider>) -> Self {
        self.providers.push(provider.into());
        self
    }

    #[must_use]
    pub fn with_loader(mut self, loader: impl Into<DynTemplateLoader>) -> Self {
        self.loaders.push(loader.into());
        self
    }

    #[must_use]
    pub fn with_extender(mut self, extender: impl Into<DynTemplateDataExtender>) -> Self {
        self.extenders.push(extender.into());
        self
    }

    #[must_use]
    pub fn with_component(mut self, component: impl Into<DynComponentRenderer>) -> Self {
        self.components.push(component.into());
        self
    }

    #[must_use]
    pub fn with_page_provider(mut self, provider: impl Into<DynPageDataProvider>) -> Self {
        self.page_providers.push(provider.into());
        self
    }

    #[must_use]
    pub fn with_page_prerenderer(mut self, prerenderer: impl Into<DynPagePrerenderer>) -> Self {
        self.page_prerenderers.push(prerenderer.into());
        self
    }

    #[must_use]
    pub fn build(self) -> TemplateRegistry {
        let mut registry = TemplateRegistry::new();

        for provider in self.providers {
            registry.register_provider(provider);
        }
        for loader in self.loaders {
            registry.register_loader(loader);
        }
        for extender in self.extenders {
            registry.register_extender(extender);
        }
        for component in self.components {
            registry.register_component(component);
        }
        for page_provider in self.page_providers {
            registry.register_page_provider(page_provider);
        }
        for prerenderer in self.page_prerenderers {
            registry.register_page_prerenderer(prerenderer);
        }

        registry
    }

    pub async fn build_and_init(self) -> Result<TemplateRegistry, TemplateError> {
        let mut registry = self.build();
        registry.initialize().await?;
        Ok(registry)
    }
}