chord_flow/model/helper/
arr.rs

1use 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}