Skip to main content

atom_engine/filters/
conditional.rs

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