json_rules_engine_fork/
rule.rs

1use crate::{
2    condition::{Condition, ConditionResult},
3    event::CoalescenceEvent,
4};
5#[cfg(feature = "eval")]
6use rhai::Engine;
7use serde::{Deserialize, Serialize};
8use serde_json::Value;
9
10#[derive(Clone, Debug, Serialize, Deserialize)]
11pub struct Rule {
12    pub conditions: Condition,
13    pub events: Vec<CoalescenceEvent>,
14}
15
16impl Rule {
17    pub fn check_value(
18        &self,
19        info: &Value,
20        #[cfg(feature = "eval")] rhai_engine: &Engine,
21    ) -> RuleResult {
22        let condition_result = self.conditions.check_value(
23            info,
24            #[cfg(feature = "eval")]
25            rhai_engine,
26        );
27
28        let mut events = self.events.clone();
29
30        for CoalescenceEvent {
31            coalescence_group, ..
32        } in &mut events
33        {
34            if let Some(coalescence_group) = coalescence_group {
35                if let Ok(new_coalescence_group) =
36                    &mut mustache::compile_str(coalescence_group)
37                        .and_then(|template| template.render_to_string(info))
38                {
39                    *coalescence_group = new_coalescence_group.clone();
40                }
41            }
42        }
43
44        RuleResult {
45            condition_result,
46            events,
47        }
48    }
49}
50
51#[derive(Debug, Serialize, Deserialize)]
52pub struct RuleResult {
53    pub condition_result: ConditionResult,
54    pub events: Vec<CoalescenceEvent>,
55}