femstache 0.1.4

Embrace the feminine mustache to unlock your templating dreams! Or something, I don't know. :3
Documentation
use std::collections::BTreeMap;

use crate::{
    env::TemplateEnv,
    error::EvalResult,
    input::TemplateInput,
    loader::{TemplateLoader, TemplateSource},
    output::{EscapeMode, Output},
    renderer::TemplateRenderer,
};

/// Encapsulates all of the template loading and rendering logic; this is most
/// likely what you want.
#[derive(Debug)]
pub struct Femstache {
    loader: TemplateLoader,
    escape: EscapeMode,
}

impl Femstache {
    /// Create a [Femstache] instance from a [TemplateSource] and [EscapeMode]
    pub fn new(source: TemplateSource, escape: EscapeMode) -> Self {
        let loader = TemplateLoader::new(source);
        Self { loader, escape }
    }

    /// Render the template at `path` in the store, with `inputs` as the inputs
    pub fn render(&self, path: &str, inputs: &impl TemplateInput) -> EvalResult<String> {
        let template = self.loader.load(path)?;
        let env = TemplateEnv::new(inputs);
        let mut renderer = TemplateRenderer::new(env, BTreeMap::new(), Some(self.loader.clone()));
        let mut output = Output::string(self.escape);
        renderer.render_document(&template.doc, &mut output)?;
        Ok(output.into_inner())
    }
}