diff --git a/src/helpers/helper_boolean.rs b/src/helpers/helper_extras.rs similarity index 72% rename from src/helpers/helper_boolean.rs rename to src/helpers/helper_extras.rs index c58f9fb4e..fe8f7a7d3 100644 --- a/src/helpers/helper_boolean.rs +++ b/src/helpers/helper_extras.rs @@ -1,4 +1,5 @@ //! Helpers for boolean operations +use serde_json::Value as Json; use crate::json::value::JsonTruthy; @@ -11,6 +12,14 @@ handlebars_helper!(lte: |x: i64, y: i64| x <= y); handlebars_helper!(and: |x: Json, y: Json| x.is_truthy(false) && y.is_truthy(false)); handlebars_helper!(or: |x: Json, y: Json| x.is_truthy(false) || y.is_truthy(false)); handlebars_helper!(not: |x: Json| !x.is_truthy(false)); +handlebars_helper!(len: |x: Json| { + match x { + Json::Array(a) => a.len(), + Json::Object(m) => m.len(), + Json::String(s) => s.len(), + _ => 0 + } +}); #[cfg(test)] mod test_conditions { @@ -75,4 +84,29 @@ mod test_conditions { .unwrap(); assert_eq!(&result, "ipsum"); } + + #[test] + fn test_len() { + let handlebars = crate::Handlebars::new(); + + let result = handlebars + .render_template("{{len value}}", &json!({"value": [1,2,3]})) + .unwrap(); + assert_eq!(&result, "3"); + + let result = handlebars + .render_template("{{len value}}", &json!({"value": {"a" :1, "b": 2}})) + .unwrap(); + assert_eq!(&result, "2"); + + let result = handlebars + .render_template("{{len value}}", &json!({"value": "tomcat"})) + .unwrap(); + assert_eq!(&result, "6"); + + let result = handlebars + .render_template("{{len value}}", &json!({"value": 3})) + .unwrap(); + assert_eq!(&result, "0"); + } } diff --git a/src/helpers/mod.rs b/src/helpers/mod.rs index 8d1c2d7d6..a0bd0d0b8 100644 --- a/src/helpers/mod.rs +++ b/src/helpers/mod.rs @@ -132,8 +132,8 @@ impl< } mod block_util; -pub(crate) mod helper_boolean; mod helper_each; +pub(crate) mod helper_extras; mod helper_if; mod helper_log; mod helper_lookup; diff --git a/src/registry.rs b/src/registry.rs index cbf884a0c..46f628731 100644 --- a/src/registry.rs +++ b/src/registry.rs @@ -138,15 +138,16 @@ impl<'reg> Registry<'reg> { self.register_helper("raw", Box::new(helpers::RAW_HELPER)); self.register_helper("log", Box::new(helpers::LOG_HELPER)); - self.register_helper("eq", Box::new(helpers::helper_boolean::eq)); - self.register_helper("ne", Box::new(helpers::helper_boolean::ne)); - self.register_helper("gt", Box::new(helpers::helper_boolean::gt)); - self.register_helper("gte", Box::new(helpers::helper_boolean::gte)); - self.register_helper("lt", Box::new(helpers::helper_boolean::lt)); - self.register_helper("lte", Box::new(helpers::helper_boolean::lte)); - self.register_helper("and", Box::new(helpers::helper_boolean::and)); - self.register_helper("or", Box::new(helpers::helper_boolean::or)); - self.register_helper("not", Box::new(helpers::helper_boolean::not)); + self.register_helper("eq", Box::new(helpers::helper_extras::eq)); + self.register_helper("ne", Box::new(helpers::helper_extras::ne)); + self.register_helper("gt", Box::new(helpers::helper_extras::gt)); + self.register_helper("gte", Box::new(helpers::helper_extras::gte)); + self.register_helper("lt", Box::new(helpers::helper_extras::lt)); + self.register_helper("lte", Box::new(helpers::helper_extras::lte)); + self.register_helper("and", Box::new(helpers::helper_extras::and)); + self.register_helper("or", Box::new(helpers::helper_extras::or)); + self.register_helper("not", Box::new(helpers::helper_extras::not)); + self.register_helper("len", Box::new(helpers::helper_extras::len)); self.register_decorator("inline", Box::new(decorators::INLINE_DECORATOR)); self @@ -612,7 +613,7 @@ mod test { // built-in helpers plus 1 let num_helpers = 7; - let num_boolean_helpers = 9; // stuff like gt and lte + let num_boolean_helpers = 10; // stuff like gt and lte let num_custom_helpers = 1; // dummy from above assert_eq!( r.helpers.len(),