1 use crate::context
::Context
;
2 use crate::error
::RenderError
;
3 use crate::helpers
::{HelperDef, HelperResult}
;
4 use crate::json
::value
::JsonTruthy
;
5 use crate::output
::Output
;
6 use crate::registry
::Registry
;
7 use crate::render
::{Helper, RenderContext, Renderable}
;
14 impl HelperDef
for IfHelper
{
15 fn call
<'reg
: 'rc
, 'rc
>(
17 h
: &Helper
<'reg
, 'rc
>,
18 r
: &'reg Registry
<'reg
>,
20 rc
: &mut RenderContext
<'reg
, 'rc
>,
25 .ok_or_else(|| RenderError
::new("Param not found for helper \"if\""))?
;
27 .hash_get("includeZero")
28 .and_then(|v
| v
.value().as_bool())
31 let mut value
= param
.value().is_truthy(include_zero
);
37 let tmpl
= if value { h.template() }
else { h.inverse() }
;
39 Some(ref t
) => t
.render(r
, ctx
, rc
, out
),
45 pub static IF_HELPER
: IfHelper
= IfHelper { positive: true }
;
46 pub static UNLESS_HELPER
: IfHelper
= IfHelper { positive: false }
;
50 use crate::helpers
::WITH_HELPER
;
51 use crate::registry
::Registry
;
52 use serde_json
::value
::Value
as Json
;
53 use std
::str::FromStr
;
57 let mut handlebars
= Registry
::new();
59 .register_template_string("t0", "{{#if this}}hello{{/if}}")
62 .register_template_string("t1", "{{#unless this}}hello{{else}}world{{/unless}}")
65 let r0
= handlebars
.render("t0", &true);
66 assert_eq
!(r0
.ok().unwrap(), "hello".to_string());
68 let r1
= handlebars
.render("t1", &true);
69 assert_eq
!(r1
.ok().unwrap(), "world".to_string());
71 let r2
= handlebars
.render("t0", &false);
72 assert_eq
!(r2
.ok().unwrap(), "".to_string());
76 fn test_if_context() {
77 let json_str
= r
#"{"a":{"b":99,"c":{"d": true}}}"#;
78 let data
= Json
::from_str(json_str
).unwrap();
80 let mut handlebars
= Registry
::new();
81 handlebars
.register_helper("with", Box
::new(WITH_HELPER
));
83 .register_template_string("t0", "{{#if a.c.d}}hello {{a.b}}{{/if}}")
86 .register_template_string(
88 "{{#with a}}{{#if c.d}}hello {{../a.b}}{{/if}}{{/with}}"
92 let r0
= handlebars
.render("t0", &data
);
93 assert_eq
!(r0
.unwrap(), "hello 99".to_string());
95 let r1
= handlebars
.render("t1", &data
);
96 assert_eq
!(r1
.unwrap(), "hello 99".to_string());
100 fn test_if_include_zero() {
102 let handlebars
= Registry
::new();
107 .render_template("{{#if a}}1{{else}}0{{/if}}", &json
!({"a": 0}
))
114 "{{#if a includeZero=true}}1{{else}}0{{/if}}",
123 "{{#if a includeZero=true}}1{{else}}0{{/if}}",
124 &json
!({ "a": f64::NAN }
)
131 fn test_invisible_line_stripping() {
132 let hbs
= Registry
::new();
135 hbs
.render_template("{{#if a}}\nyes\n{{/if}}\n", &json
!({"a": true}
))
141 hbs
.render_template("{{#if a}}x{{/if}}\ny", &json
!({"a": true}
))
147 hbs
.render_template("{{#if a}}\nx\n{{^}}\ny\n{{/if}}\nz", &json
!({"a": false}
))