handbar 0.0.5

Fork of Handlebars.
use crate::error::RenderError;
use crate::helpers::{Context, Helper, HelperDef, RenderContext, ScopedJson};
use crate::registry::Registry;
use crate::PathAndJson;

pub fn render_fmt_message<'rc>(mut mess: String, args: &[PathAndJson<'rc>]) -> String {
    for arg in args {
        mess = mess.replace("{}", &arg.value().clone().to_string());
    }

    mess
}

#[derive(Clone, Copy)]
pub struct ErrorHelper {
    name: crate::HelperName,
}

impl HelperDef for ErrorHelper {
    fn call_inner<'reg: 'rc, 'rc>(
        &self,
        h: &Helper<'rc>,
        _: &'reg Registry<'reg>,
        _: &'rc Context,
        _: &mut RenderContext<'reg, 'rc>,
    ) -> Result<ScopedJson<'rc>, RenderError> {
        let message = h
            .param(0)
            .ok_or_else(|| {
                RenderError::new(format!(
                    "Param not found for helper \"{}\": message",
                    self.name
                ))
            })?
            .value()
            .as_str()
            .ok_or_else(|| {
                RenderError::new(format!(
                    "Param invalid for helper \"{}\": message must be string",
                    self.name
                ))
            })?
            .to_string();

        Err(RenderError::new(render_fmt_message(
            message,
            &h.params()[1..],
        )))
    }
}

pub static ERROR_HELPER: ErrorHelper = ErrorHelper {
    name: crate::HelperName::Error,
};