femstache 0.1.2

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

use femstache_parser::nodes::Document;

use crate::{
    env::TemplateEnv,
    error::{EvalResult, ParseResult},
    input::TemplateInput,
    output::Output,
    renderer::TemplateRenderer,
};

/// A compiled template
#[derive(Debug, Clone)]
pub struct Template {
    pub(crate) doc: Document,
}

impl Template {
    /// Parse a template from a string
    ///
    /// ```rust
    /// # use femstache::Template;
    /// Template::parse("hello {{place}}! :3").unwrap();
    /// ```
    pub fn parse(source: impl AsRef<str>) -> ParseResult<Template> {
        let root = femstache_parser::parse(source.as_ref())?;
        Ok(Template { doc: root })
    }

    /// Render a template using the specified input
    ///
    /// ```rust
    /// # use std::collections::BTreeMap;
    /// # use femstache::Template;
    /// let tpl = Template::parse("hello, {{place}}! :3c").unwrap();
    ///
    /// let mut map = BTreeMap::new();
    /// map.insert("place", "delicious world");
    ///
    /// assert_eq!(tpl.render(&map).unwrap(), "hello, delicious world! :3c");
    /// ```
    pub fn render(&self, inputs: &impl TemplateInput) -> EvalResult<String> {
        let env = TemplateEnv::new(inputs);
        // TODO: it should be possible to set this
        let blocks = BTreeMap::new();
        let mut renderer = TemplateRenderer::new(env, blocks, None);
        let mut output = Output::String(String::new());
        renderer.render_document(&self.doc, &mut output)?;
        Ok(output.into_inner())
    }
}