reactive_graph_std_arithmetic/behaviour/entity/gate/
behaviour_i64.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_arithmetic_model::ArithmeticGateProperties::LHS;
10use reactive_graph_std_arithmetic_model::ArithmeticGateProperties::RESULT;
11use reactive_graph_std_arithmetic_model::ArithmeticGateProperties::RHS;
12
13use crate::behaviour::as_i64;
14use crate::behaviour::entity::gate::function::ArithmeticGateI64Function;
15
16entity_behaviour!(
17    ArithmeticGateI64,
18    ArithmeticGateI64Factory,
19    ArithmeticGateI64Fsm,
20    ArithmeticGateI64BehaviourTransitions,
21    ArithmeticGateI64Validator,
22    f,
23    ArithmeticGateI64Function
24);
25
26behaviour_validator!(ArithmeticGateI64Validator, Uuid, ReactiveEntity, LHS.as_ref(), RHS.as_ref(), RESULT.as_ref());
27
28impl BehaviourInit<Uuid, ReactiveEntity> for ArithmeticGateI64BehaviourTransitions {
29    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
30        let lhs = self.reactive_instance.get(LHS).and_then(as_i64).ok_or(BehaviourInitializationFailed {})?;
31        let rhs = self.reactive_instance.get(RHS).and_then(as_i64).ok_or(BehaviourInitializationFailed {})?;
32        let f = self.f;
33        let r = f(lhs, rhs);
34        self.reactive_instance.set(RESULT, json!(r));
35        Ok(())
36    }
37}
38
39impl BehaviourConnect<Uuid, ReactiveEntity> for ArithmeticGateI64BehaviourTransitions {
40    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
41        let reactive_instance = self.reactive_instance.clone();
42        let f = self.f;
43        self.property_observers.observe_with_handle(LHS.as_ref(), move |v| {
44            if let Some(lhs) = as_i64(v.clone()) {
45                if let Some(rhs) = reactive_instance.get(RHS).and_then(as_i64) {
46                    reactive_instance.set(RESULT, json!(f(lhs, rhs)));
47                }
48            }
49        });
50        let reactive_instance = self.reactive_instance.clone();
51        let f = self.f;
52        self.property_observers.observe_with_handle(RHS.as_ref(), move |v| {
53            if let Some(rhs) = as_i64(v.clone()) {
54                if let Some(lhs) = reactive_instance.get(LHS).and_then(as_i64) {
55                    reactive_instance.set(RESULT, json!(f(lhs, rhs)));
56                }
57            }
58        });
59
60        Ok(())
61    }
62}
63impl BehaviourShutdown<Uuid, ReactiveEntity> for ArithmeticGateI64BehaviourTransitions {}
64impl BehaviourTransitions<Uuid, ReactiveEntity> for ArithmeticGateI64BehaviourTransitions {}