1 use serde_json
::value
::Value
as Json
;
3 use crate::context
::Context
;
4 use crate::error
::RenderError
;
5 use crate::helpers
::{HelperDef, HelperResult}
;
6 use crate::output
::Output
;
7 use crate::registry
::Registry
;
8 use crate::render
::{Helper, RenderContext}
;
9 use crate::value
::JsonRender
;
11 #[derive(Clone, Copy)]
12 pub struct LookupHelper
;
14 impl HelperDef
for LookupHelper
{
15 fn call
<'reg
: 'rc
, 'rc
>(
20 _
: &mut RenderContext
,
23 let collection_value
= h
25 .ok_or_else(|| RenderError
::new("Param not found for helper \"lookup\""))?
;
28 .ok_or_else(|| RenderError
::new("Insufficient params for helper \"lookup\""))?
;
30 let null
= Json
::Null
;
31 let value
= match *collection_value
.value() {
32 Json
::Array(ref v
) => index
35 .and_then(|u
| Some(u
as usize))
36 .and_then(|u
| v
.get(u
))
38 Json
::Object(ref m
) => index
41 .and_then(|k
| m
.get(k
))
45 let r
= value
.render();
46 out
.write(r
.as_ref())?
;
51 pub static LOOKUP_HELPER
: LookupHelper
= LookupHelper
;
55 use crate::registry
::Registry
;
57 use std
::collections
::BTreeMap
;
61 let mut handlebars
= Registry
::new();
63 .register_template_string("t0", "{{#each v1}}{{lookup ../../v2 @index}}{{/each}}")
66 .register_template_string("t1", "{{#each v1}}{{lookup ../../v2 1}}{{/each}}")
69 .register_template_string("t2", "{{lookup kk \"a\"}}")
72 let mut m
: BTreeMap
<String
, Vec
<u16>> = BTreeMap
::new();
73 m
.insert("v1".to_string(), vec
![1u16, 2u16, 3u16]);
74 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());