1 use serde_json
::value
::Value
as Json
;
3 use helpers
::HelperDef
;
4 use registry
::Registry
;
5 use context
::JsonRender
;
6 use render
::{RenderContext, Helper}
;
7 use error
::RenderError
;
10 pub struct LookupHelper
;
12 impl HelperDef
for LookupHelper
{
13 fn call(&self, h
: &Helper
, _
: &Registry
, rc
: &mut RenderContext
) -> Result
<(), RenderError
> {
14 let collection_value
= try
!(h
.param(0).ok_or_else(|| {
15 RenderError
::new("Param not found for helper \"lookup\"")
17 let index
= try
!(h
.param(1).ok_or_else(|| {
18 RenderError
::new("Insufficient params for helper \"lookup\"")
21 let null
= Json
::Null
;
22 let value
= match collection_value
.value() {
23 &Json
::Array(ref v
) => {
27 .and_then(|u
| Some(u
as usize))
28 .and_then(|u
| v
.get(u
))
31 &Json
::Object(ref m
) => {
32 index
.value().as_str().and_then(|k
| m
.get(k
)).unwrap_or(
38 let r
= value
.render();
39 try
!(rc
.writer
.write(r
.into_bytes().as_ref()));
44 pub static LOOKUP_HELPER
: LookupHelper
= LookupHelper
;
48 use registry
::Registry
;
50 use std
::collections
::BTreeMap
;
54 let mut handlebars
= Registry
::new();
57 .register_template_string("t0", "{{#each v1}}{{lookup ../../v2 @index}}{{/each}}")
62 .register_template_string("t1", "{{#each v1}}{{lookup ../../v2 1}}{{/each}}")
67 .register_template_string("t2", "{{lookup kk \"a\"}}")
71 let mut m
: BTreeMap
<String
, Vec
<u16>> = BTreeMap
::new();
72 m
.insert("v1".to_string(), vec
![1u16, 2u16, 3u16]);
73 m
.insert("v2".to_string(), vec
![9u16, 8u16, 7u16]);
77 "kk".to_string() => btreemap
!{"a".to_string() => "world".to_string()}
80 let r0
= handlebars
.render("t0", &m
);
81 assert_eq
!(r0
.ok().unwrap(), "987".to_string());
83 let r1
= handlebars
.render("t1", &m
);
84 assert_eq
!(r1
.ok().unwrap(), "888".to_string());
86 let r2
= handlebars
.render("t2", &m2
);
87 assert_eq
!(r2
.ok().unwrap(), "world".to_string());