atom_engine/filters/
conditional.rs1use serde_json::Value;
2use std::collections::HashMap;
3
4use super::FilterResult;
5
6pub fn when(value: &Value, args: &HashMap<String, Value>) -> FilterResult {
7 let condition = value.as_bool().unwrap_or(false);
8 let then_val = args.get("then").cloned().unwrap_or(Value::Null);
9 let else_val = args.get("else").cloned().unwrap_or(Value::Null);
10 Ok(if condition { then_val } else { else_val })
11}
12
13pub fn default_filter(value: &Value, args: &HashMap<String, Value>) -> FilterResult {
14 let is_falsy = value.is_null()
15 || (value.as_bool() == Some(false))
16 || (value.as_array().map(|a| a.is_empty()).unwrap_or(false))
17 || (value.as_object().map(|o| o.is_empty()).unwrap_or(false));
18
19 if is_falsy {
20 Ok(args.get("value").cloned().unwrap_or(Value::Null))
21 } else {
22 Ok(value.clone())
23 }
24}
25
26pub fn coalesce(value: &Value, args: &HashMap<String, Value>) -> FilterResult {
27 if !value.is_null() {
28 return Ok(value.clone());
29 }
30
31 for i in 0.. {
32 if let Some(v) = args.get(&format!("{}", i)) {
33 if !v.is_null() {
34 return Ok(v.clone());
35 }
36 } else {
37 break;
38 }
39 }
40
41 Ok(Value::Null)
42}
43
44pub fn defined(value: &Value, _: &HashMap<String, Value>) -> FilterResult {
45 Ok(Value::Bool(!value.is_null()))
46}
47
48pub fn undefined(value: &Value, _: &HashMap<String, Value>) -> FilterResult {
49 Ok(Value::Bool(value.is_null()))
50}
51
52pub fn empty(value: &Value, _: &HashMap<String, Value>) -> FilterResult {
53 let is_empty = match value {
54 Value::Null => true,
55 Value::String(s) => s.is_empty(),
56 Value::Array(arr) => arr.is_empty(),
57 Value::Object(obj) => obj.is_empty(),
58 _ => false,
59 };
60 Ok(Value::Bool(is_empty))
61}
62
63pub fn not_empty(value: &Value, _: &HashMap<String, Value>) -> FilterResult {
64 let is_empty = match value {
65 Value::Null => true,
66 Value::String(s) => s.is_empty(),
67 Value::Array(arr) => arr.is_empty(),
68 Value::Object(obj) => obj.is_empty(),
69 _ => false,
70 };
71 Ok(Value::Bool(!is_empty))
72}