reactive_graph_std_comparison/behaviour/entity/gate/
behaviour.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::json;
7use uuid::Uuid;
8
9use reactive_graph_std_comparison_model::ComparisonGateProperties::LHS;
10use reactive_graph_std_comparison_model::ComparisonGateProperties::RHS;
11use reactive_graph_std_result_model::ResultBooleanProperties::RESULT;
12
13use crate::behaviour::entity::gate::function::ComparisonGateFunction;
14
15entity_behaviour!(
16    ComparisonGate,
17    ComparisonGateFactory,
18    ComparisonGateFsm,
19    ComparisonGateBehaviourTransitions,
20    ComparisonGateValidator,
21    f,
22    ComparisonGateFunction
23);
24
25behaviour_validator!(ComparisonGateValidator, Uuid, ReactiveEntity, LHS.as_ref(), RHS.as_ref(), RESULT.as_ref());
26
27impl BehaviourInit<Uuid, ReactiveEntity> for ComparisonGateBehaviourTransitions {
28    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
29        let lhs = self.reactive_instance.get(LHS).ok_or(BehaviourInitializationFailed {})?;
30        let rhs = self.reactive_instance.get(RHS).ok_or(BehaviourInitializationFailed {})?;
31        let f = self.f;
32        let initial_value = f(&lhs, &rhs);
33        self.reactive_instance.set(RESULT, initial_value);
34        Ok(())
35    }
36}
37
38impl BehaviourConnect<Uuid, ReactiveEntity> for ComparisonGateBehaviourTransitions {
39    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
40        let reactive_instance = self.reactive_instance.clone();
41        let f = self.f;
42        self.property_observers.observe_with_handle(LHS.as_ref(), move |lhs| {
43            if let Some(rhs) = reactive_instance.get(RHS) {
44                reactive_instance.set(RESULT, json!(f(lhs, &rhs)));
45            }
46        });
47        let reactive_instance = self.reactive_instance.clone();
48        let f = self.f;
49        self.property_observers.observe_with_handle(RHS.as_ref(), move |rhs| {
50            if let Some(lhs) = reactive_instance.get(LHS) {
51                reactive_instance.set(RESULT, json!(f(&lhs, rhs)));
52            }
53        });
54        Ok(())
55    }
56}
57impl BehaviourShutdown<Uuid, ReactiveEntity> for ComparisonGateBehaviourTransitions {}
58impl BehaviourTransitions<Uuid, ReactiveEntity> for ComparisonGateBehaviourTransitions {}