use super::handlebars_ext::HandlebarsExt;
use handlebars::{HelperDef, RenderError, ScopedJson};
use serde_json::Value;
use std::collections::HashMap;
pub const GLOBAL_PARAMETERS_HELPER: &str = "global_parameter";
pub struct GlobalParameterHelper {
values: HashMap<String, Value>,
}
impl GlobalParameterHelper {
pub fn new(values: HashMap<String, Value>) -> Self {
Self { values }
}
}
impl HelperDef for GlobalParameterHelper {
fn call_inner<'reg: 'rc, 'rc>(
&self,
h: &handlebars::Helper<'reg, 'rc>,
_: &'reg handlebars::Handlebars<'reg>,
_: &'rc handlebars::Context,
_: &mut handlebars::RenderContext<'reg, 'rc>,
) -> Result<ScopedJson<'reg, 'rc>, RenderError> {
h.ensure_arguments_count_min(1, GLOBAL_PARAMETERS_HELPER)?;
h.ensure_arguments_count_max(2, GLOBAL_PARAMETERS_HELPER)?;
let key = h.get_param_as_str_or_fail(0, GLOBAL_PARAMETERS_HELPER)?.to_string();
match self.values.get(&key).cloned() {
Some(v) => Ok(ScopedJson::Derived(v)),
None => {
let strict_mode = h.get_param_as_bool(1).unwrap_or(false);
if strict_mode {
Err(RenderError::new(format!(
"`{}`, error: Cannot find a value for key `{}`",
GLOBAL_PARAMETERS_HELPER, key
)))
} else {
Ok(ScopedJson::Derived(Default::default()))
}
}
}
}
}