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