1 #[cfg(all(feature = "rustc_ser_type", not(feature = "serde_type")))]
2 use serialize
::json
::Json
;
3 #[cfg(feature = "serde_type")]
4 use serde_json
::value
::Value
as Json
;
6 use helpers
::HelperDef
;
7 use registry
::Registry
;
8 use context
::JsonRender
;
9 use render
::{RenderContext, RenderError, Helper}
;
11 #[derive(Clone, Copy)]
12 pub struct LookupHelper
;
14 impl HelperDef
for LookupHelper
{
15 fn call(&self, h
: &Helper
, _
: &Registry
, rc
: &mut RenderContext
) -> Result
<(), RenderError
> {
16 let collection_value
= try
!(h
.param(0).ok_or_else(|| {
17 RenderError
::new("Param not found for helper \"lookup\"")
19 let index
= try
!(h
.param(1).ok_or_else(|| {
20 RenderError
::new("Insufficient params for helper \"lookup\"")
23 let null
= Json
::Null
;
24 let value
= match collection_value
.value() {
25 &Json
::Array(ref v
) => {
28 .and_then(|u
| Some(u
as usize))
29 .and_then(|u
| v
.get(u
))
32 #[cfg(all(feature = "rustc_ser_type", not(feature = "serde_type")))]
33 &Json
::Object(ref m
) => {
36 .and_then(|k
| m
.get(k
))
39 #[cfg(feature = "serde_type")]
40 &Json
::Object(ref m
) => {
43 .and_then(|k
| m
.get(k
))
48 let r
= value
.render();
49 try
!(rc
.writer
.write(r
.into_bytes().as_ref()));
54 pub static LOOKUP_HELPER
: LookupHelper
= LookupHelper
;
58 use registry
::Registry
;
60 use std
::collections
::BTreeMap
;
64 let mut handlebars
= Registry
::new();
65 assert
!(handlebars
.register_template_string("t0", "{{#each v1}}{{lookup ../../v2 @index}}{{/each}}").is_ok());
66 assert
!(handlebars
.register_template_string("t1",
67 "{{#each v1}}{{lookup ../../v2 1}}{{/each}}")
69 assert
!(handlebars
.register_template_string("t2", "{{lookup kk \"a\"}}").is_ok());
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]);
76 "kk".to_string() => btreemap
!{"a".to_string() => "world".to_string()}
79 let r0
= handlebars
.render("t0", &m
);
80 assert_eq
!(r0
.ok().unwrap(), "987".to_string());
82 let r1
= handlebars
.render("t1", &m
);
83 assert_eq
!(r1
.ok().unwrap(), "888".to_string());
85 let r2
= handlebars
.render("t2", &m2
);
86 assert_eq
!(r2
.ok().unwrap(), "world".to_string());