]> git.proxmox.com Git - rustc.git/blob - vendor/handlebars/src/helpers/helper_lookup.rs
New upstream version 1.38.0+dfsg1
[rustc.git] / vendor / handlebars / src / helpers / helper_lookup.rs
1 use serde_json::value::Value as Json;
2
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;
10
11 #[derive(Clone, Copy)]
12 pub struct LookupHelper;
13
14 impl HelperDef for LookupHelper {
15 fn call<'reg: 'rc, 'rc>(
16 &self,
17 h: &Helper,
18 _: &Registry,
19 _: &Context,
20 _: &mut RenderContext,
21 out: &mut dyn Output,
22 ) -> HelperResult {
23 let collection_value = h
24 .param(0)
25 .ok_or_else(|| RenderError::new("Param not found for helper \"lookup\""))?;
26 let index = h
27 .param(1)
28 .ok_or_else(|| RenderError::new("Insufficient params for helper \"lookup\""))?;
29
30 let null = Json::Null;
31 let value = match *collection_value.value() {
32 Json::Array(ref v) => index
33 .value()
34 .as_u64()
35 .and_then(|u| Some(u as usize))
36 .and_then(|u| v.get(u))
37 .unwrap_or(&null),
38 Json::Object(ref m) => index
39 .value()
40 .as_str()
41 .and_then(|k| m.get(k))
42 .unwrap_or(&null),
43 _ => &null,
44 };
45 let r = value.render();
46 out.write(r.as_ref())?;
47 Ok(())
48 }
49 }
50
51 pub static LOOKUP_HELPER: LookupHelper = LookupHelper;
52
53 #[cfg(test)]
54 mod test {
55 use crate::registry::Registry;
56
57 use std::collections::BTreeMap;
58
59 #[test]
60 fn test_lookup() {
61 let mut handlebars = Registry::new();
62 assert!(handlebars
63 .register_template_string("t0", "{{#each v1}}{{lookup ../../v2 @index}}{{/each}}")
64 .is_ok());
65 assert!(handlebars
66 .register_template_string("t1", "{{#each v1}}{{lookup ../../v2 1}}{{/each}}")
67 .is_ok());
68 assert!(handlebars
69 .register_template_string("t2", "{{lookup kk \"a\"}}")
70 .is_ok());
71
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]);
75
76 let m2 = btreemap! {
77 "kk".to_string() => btreemap!{"a".to_string() => "world".to_string()}
78 };
79
80 let r0 = handlebars.render("t0", &m);
81 assert_eq!(r0.ok().unwrap(), "987".to_string());
82
83 let r1 = handlebars.render("t1", &m);
84 assert_eq!(r1.ok().unwrap(), "888".to_string());
85
86 let r2 = handlebars.render("t2", &m2);
87 assert_eq!(r2.ok().unwrap(), "world".to_string());
88 }
89 }