From cec5ec9d1e779bc175c932401004810d276b2691 Mon Sep 17 00:00:00 2001 From: Ning Sun Date: Wed, 17 Oct 2018 23:04:37 +0800 Subject: [PATCH] (feat) added include zero option for truthy check [#240] --- src/helpers/helper_each.rs | 2 +- src/helpers/helper_if.rs | 2 +- src/helpers/helper_with.rs | 2 +- src/value.rs | 41 +++++++++++++++++++++++++++++++++++--- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/helpers/helper_each.rs b/src/helpers/helper_each.rs index 01b8854d7..5f905620e 100644 --- a/src/helpers/helper_each.rs +++ b/src/helpers/helper_each.rs @@ -36,7 +36,7 @@ impl HelperDef for EachHelper { .map(|p| format!("{}/{}", rc.get_path(), p)); debug!("each value {:?}", value.value()); - let rendered = match (value.value().is_truthy(), value.value()) { + let rendered = match (value.value().is_truthy(false), value.value()) { (true, &Json::Array(ref list)) => { let len = list.len(); for (i, _) in list.iter().enumerate().take(len) { diff --git a/src/helpers/helper_if.rs b/src/helpers/helper_if.rs index feda72a7b..353190577 100644 --- a/src/helpers/helper_if.rs +++ b/src/helpers/helper_if.rs @@ -24,7 +24,7 @@ impl HelperDef for IfHelper { .param(0) .ok_or_else(|| RenderError::new("Param not found for helper \"if\""))?; - let mut value = param.value().is_truthy(); + let mut value = param.value().is_truthy(false); if !self.positive { value = !value; diff --git a/src/helpers/helper_with.rs b/src/helpers/helper_with.rs index 1a9ebf9f9..b73f267df 100644 --- a/src/helpers/helper_with.rs +++ b/src/helpers/helper_with.rs @@ -29,7 +29,7 @@ impl HelperDef for WithHelper { let result = { let mut local_rc = rc.derive(); - let not_empty = param.value().is_truthy(); + let not_empty = param.value().is_truthy(false); let template = if not_empty { h.template() } else { diff --git a/src/value.rs b/src/value.rs index fc29e705a..f5359185c 100644 --- a/src/value.rs +++ b/src/value.rs @@ -73,7 +73,7 @@ pub trait JsonRender { } pub trait JsonTruthy { - fn is_truthy(&self) -> bool; + fn is_truthy(&self, include_zero: bool) -> bool; } impl JsonRender for Json { @@ -110,10 +110,17 @@ pub fn as_string(src: &Json) -> Option<&str> { } impl JsonTruthy for Json { - fn is_truthy(&self) -> bool { + fn is_truthy(&self, include_zero: bool) -> bool { match *self { Json::Bool(ref i) => *i, - Json::Number(ref n) => n.as_f64().map(|f| f.is_normal()).unwrap_or(false), + Json::Number(ref n) => { + if include_zero { + n.as_f64().map(|f| !f.is_nan()).unwrap_or(false) + } else { + // there is no inifity in json/serde_json + n.as_f64().map(|f| f.is_normal()).unwrap_or(false) + } + } Json::Null => false, Json::String(ref i) => !i.is_empty(), Json::Array(ref i) => !i.is_empty(), @@ -129,3 +136,31 @@ fn test_json_render() { assert_eq!(raw, thing.render()); } + +#[test] +fn test_json_number_truthy() { + assert!(json!(16i16).is_truthy(false)); + assert!(json!(16i16).is_truthy(true)); + + assert!(json!(0i16).is_truthy(true)); + assert!(!json!(0i16).is_truthy(false)); + + assert!(json!(1.0f64).is_truthy(false)); + assert!(json!(1.0f64).is_truthy(true)); + + assert!(json!(Some(16i16)).is_truthy(false)); + assert!(json!(Some(16i16)).is_truthy(true)); + + assert!(!json!(None as Option).is_truthy(false)); + assert!(!json!(None as Option).is_truthy(true)); + + assert!(!json!(std::f64::NAN).is_truthy(false)); + assert!(!json!(std::f64::NAN).is_truthy(true)); + + // there is no infinity in json/serde_json + // assert!(json!(std::f64::INFINITY).is_truthy(false)); + // assert!(json!(std::f64::INFINITY).is_truthy(true)); + + // assert!(json!(std::f64::NEG_INFINITY).is_truthy(false)); + // assert!(json!(std::f64::NEG_INFINITY).is_truthy(true)); +}