handbar 0.0.5

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

#[derive(Clone, Copy)]
pub struct IndentHelper;

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

        let width = h
            .param(1)
            .ok_or_else(|| RenderError::new("Param not found for helper \"indent\": width"))?
            .value()
            .as_u64()
            .ok_or_else(|| {
                RenderError::new(
                    "Param invalid for helper \"indent\": width must be positive number",
                )
            })?;

        let character = match h.param(2) {
            Some(character) => character.value().as_str().ok_or_else(|| {
                RenderError::new("Param invalid for helper \"indent\": character must be string")
            }),
            None => Ok(" "),
        }?;

        let result = text.replace("\n", &format!("\n{}", &character.repeat(width as usize)));
        Ok(crate::ScopedJson::Derived(crate::JsonValue::from(result)))
    }
}

pub static INDENT_HELPER: IndentHelper = IndentHelper;

#[cfg(test)]
mod test {
    #[test]
    fn test_trim() {
        assert_renders![
            (r##"{{ indent "\nfoo" 1 }}"##, "\n foo"),
            (r##"{{ indent "\nfoo" 1 "  " }}"##, "\n  foo"),
            (r##"{{ indent "\nfoo" 1 "  " }}"##, "\n  foo"),
        ];
    }
}