codegenr_lib/helpers/
params.rs

1use super::handlebars_ext::HandlebarsExt;
2use handlebars::{HelperDef, RenderError, ScopedJson};
3use serde_json::Value;
4use std::collections::HashMap;
5
6pub const GLOBAL_PARAMETERS_HELPER: &str = "global_parameter";
7
8/// Gets a value from the global parameters
9/// (those key=value's would be provided as parameters of `codegenr` execution)
10/// ```
11/// # use codegenr_lib::helpers::*;
12/// # use serde_json::json;
13/// # use std::collections::HashMap;
14/// let mut params = HashMap::<_,_>::new();
15/// params.insert("k".to_string(), json!("v"));
16///
17/// assert_eq!(
18///   exec_template_with_global_params(json!({}), r#"{{global_parameter "k"}}"#, params.clone()),
19///   "v"
20/// );
21/// assert_eq!(
22///   exec_template_with_global_params(json!({}), r#"{{global_parameter "non_existing"}}"#, params),
23///   ""
24/// );
25/// ```
26///
27/// An error will be raise if a non existing key is asked and second parameter is true
28/// ```should_panic
29/// # use serde_json::json;
30/// # use codegenr_lib::helpers::*;
31/// exec_template_with_global_params(json!({}), r#"{{global_parameter "k" true}}"#, Default::default());
32/// ```
33pub struct GlobalParameterHelper {
34  values: HashMap<String, Value>,
35}
36
37impl GlobalParameterHelper {
38  pub fn new(values: HashMap<String, Value>) -> Self {
39    Self { values }
40  }
41}
42
43impl HelperDef for GlobalParameterHelper {
44  fn call_inner<'reg: 'rc, 'rc>(
45    &self,
46    h: &handlebars::Helper<'reg, 'rc>,
47    _: &'reg handlebars::Handlebars<'reg>,
48    _: &'rc handlebars::Context,
49    _: &mut handlebars::RenderContext<'reg, 'rc>,
50  ) -> Result<ScopedJson<'reg, 'rc>, RenderError> {
51    h.ensure_arguments_count_min(1, GLOBAL_PARAMETERS_HELPER)?;
52    h.ensure_arguments_count_max(2, GLOBAL_PARAMETERS_HELPER)?;
53    let key = h.get_param_as_str_or_fail(0, GLOBAL_PARAMETERS_HELPER)?.to_string();
54
55    match self.values.get(&key).cloned() {
56      Some(v) => Ok(ScopedJson::Derived(v)),
57      None => {
58        let strict_mode = h.get_param_as_bool(1).unwrap_or(false);
59        if strict_mode {
60          Err(RenderError::new(format!(
61            "`{}`, error: Cannot find a value for key `{}`",
62            GLOBAL_PARAMETERS_HELPER, key
63          )))
64        } else {
65          Ok(ScopedJson::Derived(Default::default()))
66        }
67      }
68    }
69  }
70}