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"),
];
}
}