reactive_graph_std_arithmetic/behaviour/entity/gate/
behaviour_u64.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::RHS;
10use reactive_graph_std_arithmetic_model::ArithmeticOperationProperties::LHS;
11use reactive_graph_std_arithmetic_model::ArithmeticOperationProperties::RESULT;
12
13use crate::behaviour::as_u64;
14use crate::behaviour::entity::gate::function::ArithmeticGateU64Function;
15
16entity_behaviour!(
17    ArithmeticGateU64,
18    ArithmeticGateU64Factory,
19    ArithmeticGateU64Fsm,
20    ArithmeticGateU64BehaviourTransitions,
21    ArithmeticGateU64Validator,
22    f,
23    ArithmeticGateU64Function
24);
25
26behaviour_validator!(ArithmeticGateU64Validator, Uuid, ReactiveEntity, LHS.as_ref(), RHS.as_ref(), RESULT.as_ref());
27
28impl BehaviourInit<Uuid, ReactiveEntity> for ArithmeticGateU64BehaviourTransitions {
29    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
30        let lhs = self.reactive_instance.get(LHS).and_then(as_u64).ok_or(BehaviourInitializationFailed {})?;
31        let rhs = self.reactive_instance.get(RHS).and_then(as_u64).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 ArithmeticGateU64BehaviourTransitions {
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_u64(v.clone()) {
45                if let Some(rhs) = reactive_instance.get(RHS).and_then(as_u64) {
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_u64(v.clone()) {
54                if let Some(lhs) = reactive_instance.get(LHS).and_then(as_u64) {
55                    reactive_instance.set(RESULT, json!(f(lhs, rhs)));
56                }
57            }
58        });
59
60        Ok(())
61    }
62}
63impl BehaviourShutdown<Uuid, ReactiveEntity> for ArithmeticGateU64BehaviourTransitions {}
64impl BehaviourTransitions<Uuid, ReactiveEntity> for ArithmeticGateU64BehaviourTransitions {}