handbar 0.0.5

Fork of Handlebars.
use crate::error::RenderError;
use crate::helpers::helper_error::render_fmt_message;
use crate::helpers::{Context, Helper, HelperDef, RenderContext, ScopedJson};
use crate::registry::Registry;
use serde_json::Value as Json;

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

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

        if !matches!(value, Json::Null) {
            return Ok(value.clone().into());
        }

        if let None = h.param(1) {
            return Ok(value.clone().into());
        }

        let message = h
            .param(1)
            .unwrap()
            .value()
            .as_str()
            .ok_or_else(|| {
                RenderError::new(format!(
                    "Param invalid for helper \"{}\": error message must be string",
                    self.name
                ))
            })?
            .to_string();

        if let Json::Null = value {
            return Err(RenderError::new(render_fmt_message(
                message,
                &h.params()[1..],
            )));
        }

        return Ok(value.clone().into());
    }
}

pub static GET_HELPER: GetHelper = GetHelper {
    name: crate::HelperName::Get,
};

#[cfg(test)]
mod test {
    #[test]
    fn test_get() {
        assert_renders![(r##"{{ get "1" }}"##, "1"),];
    }
}