json_eval_rs/jsoneval/
logic.rs1use super::JSONEval;
2use crate::jsoneval::json_parser;
3use crate::rlogic::{
4 CompiledLogicId, Evaluator, compiled_logic_store
5};
6use crate::utils::clean_float_noise;
7use serde_json::Value;
8
9impl JSONEval {
10 pub fn run_logic(
12 &mut self,
13 logic_id: CompiledLogicId,
14 data: Option<&Value>,
15 context: Option<&Value>
16 ) -> Result<Value, String> {
17 let compiled_logic = compiled_logic_store::get_compiled_logic(logic_id)
19 .ok_or_else(|| format!("Compiled logic ID {:?} not found in store", logic_id))?;
20
21 let run_data = if let Some(input_data) = data {
23 let context_value = context.unwrap_or(&self.context);
24 self.eval_data.replace_data_and_context(input_data.clone(), context_value.clone());
25 self.eval_data.data()
26 } else {
27 self.eval_data.data()
28 };
29
30 let evaluator = Evaluator::new();
32 let result = evaluator.evaluate(&compiled_logic, run_data)
33 .map_err(|e| format!("Execution error: {}", e))?;
34
35 Ok(clean_float_noise(result))
36 }
37
38 pub fn compile_logic(&self, logic_str: &str) -> Result<CompiledLogicId, String> {
40 compiled_logic_store::compile_logic(logic_str)
41 }
42
43 pub fn compile_logic_value(&self, logic: &Value) -> Result<CompiledLogicId, String> {
45 compiled_logic_store::compile_logic_value(logic)
46 }
47
48 pub fn compile_and_run_logic(
50 &mut self,
51 logic_str: &str,
52 data: Option<&str>,
53 context: Option<&str>
54 ) -> Result<Value, String> {
55 let id = self.compile_logic(logic_str)?;
56
57 let data_value = if let Some(d) = data {
59 Some(json_parser::parse_json_str(d)?)
60 } else {
61 None
62 };
63
64 let context_value = if let Some(c) = context {
65 Some(json_parser::parse_json_str(c)?)
66 } else {
67 None
68 };
69
70 self.run_logic(id, data_value.as_ref(), context_value.as_ref())
71 }
72}
73
74pub fn evaluate_logic_pure(
84 logic_str: &str,
85 data_str: Option<&str>,
86 context_str: Option<&str>,
87) -> Result<Value, String> {
88 let logic_value = json_parser::parse_json_str(logic_str)
90 .map_err(|e| format!("Invalid logic JSON: {}", e))?;
91 let compiled = crate::rlogic::CompiledLogic::compile(&logic_value)
92 .map_err(|e| format!("Logic compilation failed: {}", e))?;
93
94 let mut data_value = if let Some(d) = data_str {
96 json_parser::parse_json_str(d)
97 .map_err(|e| format!("Invalid data JSON: {}", e))?
98 } else {
99 Value::Null
100 };
101
102 if let Some(c) = context_str {
104 let context_value = json_parser::parse_json_str(c)
105 .map_err(|e| format!("Invalid context JSON: {}", e))?;
106
107 if data_value.is_null() {
109 let mut map = serde_json::Map::new();
110 map.insert("$context".to_string(), context_value);
111 data_value = Value::Object(map);
112 } else if let Some(obj) = data_value.as_object_mut() {
113 obj.insert("$context".to_string(), context_value);
114 }
115 }
117
118 let evaluator = Evaluator::new();
120 evaluator.evaluate(&compiled, &data_value)
121 .map(|v| clean_float_noise(v))
122 .map_err(|e| format!("Evaluation error: {}", e))
123}