reactive_graph_std_string/behaviour/entity/string_comparison/
mod.rs

1use reactive_graph_behaviour_model_api::behaviour_validator;
2use reactive_graph_behaviour_model_api::prelude::*;
3use reactive_graph_behaviour_model_impl::entity_behaviour;
4use reactive_graph_graph::prelude::*;
5use reactive_graph_reactive_model_impl::ReactiveEntity;
6use serde_json::Value;
7use serde_json::json;
8use uuid::Uuid;
9
10pub use function::StringComparisonFunction;
11
12use reactive_graph_std_result_model::ResultBooleanProperties::RESULT;
13use reactive_graph_std_string_model::StringComparisonProperties::LHS;
14use reactive_graph_std_string_model::StringComparisonProperties::RHS;
15
16pub mod function;
17
18entity_behaviour!(
19    StringComparison,
20    StringComparisonFactory,
21    StringComparisonFsm,
22    StringComparisonBehaviourTransitions,
23    StringComparisonValidator,
24    f,
25    StringComparisonFunction
26);
27
28behaviour_validator!(StringComparisonValidator, Uuid, ReactiveEntity, LHS.as_ref(), RESULT.as_ref());
29
30impl BehaviourInit<Uuid, ReactiveEntity> for StringComparisonBehaviourTransitions {
31    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
32        let lhs = self
33            .reactive_instance
34            .get(LHS)
35            .and_then(|lhs| lhs.as_str().map(|lhs| lhs.to_string()))
36            .ok_or(BehaviourInitializationFailed {})?;
37        let rhs = self
38            .reactive_instance
39            .get(RHS)
40            .and_then(|rhs| rhs.as_str().map(|rhs| rhs.to_string()))
41            .ok_or(BehaviourInitializationFailed {})?;
42        let f = self.f;
43        self.reactive_instance.set(RESULT, json!(f(lhs, rhs)));
44        Ok(())
45    }
46}
47
48impl BehaviourConnect<Uuid, ReactiveEntity> for StringComparisonBehaviourTransitions {
49    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
50        let reactive_instance = self.reactive_instance.clone();
51        let f = self.f;
52        self.property_observers.observe_with_handle(LHS.as_ref(), move |lhs: &Value| {
53            if let Some(lhs) = lhs.as_str().map(|lhs| lhs.to_string()) {
54                if let Some(rhs) = reactive_instance.get(RHS).and_then(|rhs| rhs.as_str().map(|rhs| rhs.to_string())) {
55                    reactive_instance.set(RESULT, json!(f(lhs, rhs)));
56                }
57            }
58        });
59        let reactive_instance = self.reactive_instance.clone();
60        let f = self.f;
61        self.property_observers.observe_with_handle(RHS.as_ref(), move |rhs: &Value| {
62            if let Some(rhs) = rhs.as_str().map(|rhs| rhs.to_string()) {
63                if let Some(lhs) = reactive_instance.get(LHS).and_then(|lhs| lhs.as_str().map(|lhs| lhs.to_string())) {
64                    reactive_instance.set(RESULT, json!(f(lhs, rhs)));
65                }
66            }
67        });
68        Ok(())
69    }
70}
71
72impl BehaviourShutdown<Uuid, ReactiveEntity> for StringComparisonBehaviourTransitions {}
73impl BehaviourTransitions<Uuid, ReactiveEntity> for StringComparisonBehaviourTransitions {}