chord_flow/model/helper/
arr.rs1use handlebars::handlebars_helper;
2use handlebars::{Context, Handlebars, Helper, HelperDef, RenderContext, RenderError, ScopedJson};
3
4use chord_core::value::{from_str, Number, Value};
5
6handlebars_helper!(CONTAINS: |x: Json, y: Json|{
7 x.is_array() && x.as_array().unwrap().contains(y)
8});
9
10pub static ARR: ArrHelper = ArrHelper {};
11pub static LEN: LenHelper = LenHelper {};
12pub static SUB: SubHelper = SubHelper {};
13pub static GET: GetHelper = GetHelper {};
14
15#[derive(Clone, Copy)]
16pub struct ArrHelper {}
17
18impl HelperDef for ArrHelper {
19 fn call_inner<'reg: 'rc, 'rc>(
20 &self,
21 h: &Helper<'reg, 'rc>,
22 _: &'reg Handlebars<'reg>,
23 _: &'rc Context,
24 _: &mut RenderContext<'reg, 'rc>,
25 ) -> Result<ScopedJson<'reg, 'rc>, RenderError> {
26 let param = h
27 .param(0)
28 .ok_or_else(|| RenderError::new("Param not found for helper \"arr\""))?;
29
30 match param.value() {
31 Value::String(txt) => Ok(ScopedJson::Derived(Value::Array(from_str(txt)?))),
32 Value::Array(arr) => Ok(ScopedJson::Derived(Value::Array(arr.clone()))),
33 _ => Err(RenderError::new("\"arr\" can not convert ")),
34 }
35 }
36}
37
38#[derive(Clone, Copy)]
39pub struct SubHelper;
40
41impl HelperDef for SubHelper {
42 fn call_inner<'reg: 'rc, 'rc>(
43 &self,
44 h: &Helper<'reg, 'rc>,
45 _: &'reg Handlebars<'reg>,
46 _: &'rc Context,
47 _: &mut RenderContext<'reg, 'rc>,
48 ) -> Result<ScopedJson<'reg, 'rc>, RenderError> {
49 let params = h.params();
50 let arr = params[0]
51 .value()
52 .as_array()
53 .ok_or(RenderError::new("Param invalid for helper \"arr_sub\""))?;
54
55 if params.len() == 2 {
56 let start = params[1]
57 .value()
58 .as_f64()
59 .ok_or(RenderError::new("Param invalid for helper \"arr_sub\""))?
60 as usize;
61 let mut a = Vec::<Value>::new();
62 a.clone_from_slice(&arr[start..]);
63 return Ok(ScopedJson::Derived(Value::Array(a)));
64 } else if params.len() == 3 {
65 let start = params[1]
66 .value()
67 .as_f64()
68 .ok_or(RenderError::new("Param invalid for helper \"arr_sub\""))?
69 as usize;
70 let end = params[2]
71 .value()
72 .as_f64()
73 .ok_or(RenderError::new("Param invalid for helper \"arr_sub\""))?
74 as usize;
75 let mut a = Vec::<Value>::new();
76 a.clone_from_slice(&arr[start..end]);
77 return Ok(ScopedJson::Derived(Value::Array(a)));
78 } else {
79 return Err(RenderError::new("Param invalid for helper \"arr_sub\""));
80 }
81 }
82}
83
84#[derive(Clone, Copy)]
85pub struct LenHelper {}
86
87impl HelperDef for LenHelper {
88 fn call_inner<'reg: 'rc, 'rc>(
89 &self,
90 h: &Helper<'reg, 'rc>,
91 _: &'reg Handlebars<'reg>,
92 _: &'rc Context,
93 _: &mut RenderContext<'reg, 'rc>,
94 ) -> Result<ScopedJson<'reg, 'rc>, RenderError> {
95 let params = h.params();
96 let arr = params[0]
97 .value()
98 .as_array()
99 .ok_or(RenderError::new("Param invalid for helper \"arr_len\""))?;
100
101 Ok(ScopedJson::Derived(Value::Number(Number::from(arr.len()))))
102 }
103}
104
105#[derive(Clone, Copy)]
106pub struct GetHelper {}
107
108impl HelperDef for GetHelper {
109 fn call_inner<'reg: 'rc, 'rc>(
110 &self,
111 h: &Helper<'reg, 'rc>,
112 _: &'reg Handlebars<'reg>,
113 _: &'rc Context,
114 _: &mut RenderContext<'reg, 'rc>,
115 ) -> Result<ScopedJson<'reg, 'rc>, RenderError> {
116 let params = h.params();
117 let arr = params[0]
118 .value()
119 .as_array()
120 .ok_or(RenderError::new("Param invalid for helper \"arr_get\""))?;
121
122 if params.len() == 2 {
123 let start = params[1]
124 .value()
125 .as_f64()
126 .ok_or(RenderError::new("Param invalid for helper \"arr_get\""))?
127 as usize;
128 let result = if arr.len() > 0 {
129 arr[start].clone()
130 } else {
131 Value::Null
132 };
133 return Ok(ScopedJson::Derived(result));
134 } else {
135 return Err(RenderError::new("Param invalid for helper \"arr_get\""));
136 }
137 }
138}