custom_advance/
custom_advance.rs1use datalogic_rs::arena::DataArena;
2use datalogic_rs::value::NumberValue;
3use datalogic_rs::{CustomOperator, DataLogic, DataValue, Result};
4use serde_json::json;
5use std::fmt::Debug;
6
7#[derive(Debug)]
9struct MultiplyAll;
10
11impl CustomOperator for MultiplyAll {
12 fn evaluate<'a>(
13 &self,
14 args: &'a [DataValue<'a>],
15 arena: &'a DataArena,
16 ) -> Result<&'a DataValue<'a>> {
17 if args.is_empty() {
19 return Ok(arena.alloc(DataValue::Number(NumberValue::from_i64(1))));
20 }
21
22 let mut product = 1.0;
24 for arg in args {
25 if let Some(n) = arg.as_f64() {
26 product *= n;
27 }
28 }
29
30 Ok(arena.alloc(DataValue::Number(NumberValue::from_f64(product))))
32 }
33}
34
35#[derive(Debug)]
37struct Median;
38
39impl CustomOperator for Median {
40 fn evaluate<'a>(
41 &self,
42 args: &'a [DataValue<'a>],
43 arena: &'a DataArena,
44 ) -> Result<&'a DataValue<'a>> {
45 let mut numbers = Vec::new();
47
48 if args.len() == 1 && args[0].is_array() {
50 if let Some(items) = args[0].as_array() {
51 for item in items {
52 if let Some(n) = item.as_f64() {
53 numbers.push(n);
54 }
55 }
56 }
57 } else {
58 for arg in args {
60 if let Some(n) = arg.as_f64() {
61 numbers.push(n);
62 }
63 }
64 }
65
66 if numbers.is_empty() {
68 return Ok(arena.alloc(DataValue::Number(NumberValue::from_i64(0))));
69 }
70
71 numbers.sort_by(|a, b| a.partial_cmp(b).unwrap());
73
74 let median = if numbers.len() % 2 == 0 {
76 let mid = numbers.len() / 2;
78 (numbers[mid - 1] + numbers[mid]) / 2.0
79 } else {
80 numbers[numbers.len() / 2]
82 };
83
84 Ok(arena.alloc(DataValue::Number(NumberValue::from_f64(median))))
86 }
87}
88
89fn main() {
90 let mut dl = DataLogic::new();
91
92 dl.register_custom_operator("multiply_all", Box::new(MultiplyAll));
94 dl.register_custom_operator("median", Box::new(Median));
95
96 let result = dl
98 .evaluate_str(r#"{"multiply_all": [2, 3, 4]}"#, r#"{}"#, None)
99 .unwrap();
100
101 println!("Product of [2, 3, 4] = {}", result);
102
103 let result = dl
105 .evaluate_json(&json!({"median": [7, 3, 5, 9, 1]}), &json!({}), None)
106 .unwrap();
107
108 println!("Median of [7, 3, 5, 9, 1] = {}", result);
109
110 let complex_logic = json!({
112 "if": [
113 {"<": [{"var": "score"}, 60]},
114 "Failed",
115 {">=": [{"var": "score"}, {"median": {"var": "class_scores"}}]},
116 "Above average",
117 "Below average"
118 ]
119 });
120
121 let data = json!({
122 "score": 75,
123 "class_scores": [60, 70, 80, 90, 100]
124 });
125
126 let result = dl.evaluate_json(&complex_logic, &data, None).unwrap();
127 println!("Student result: {}", result);
128
129 let combined_logic = json!({
131 "multiply_all": [
132 2,
133 {"median": [1, 2, 3, 4, 5]},
134 4
135 ]
136 });
137
138 let result = dl.evaluate_json(&combined_logic, &json!({}), None).unwrap();
139 println!("2 * median([1, 2, 3, 4, 5]) * 4 = {}", result);
140}