reactive_graph_std_arithmetic/behaviour/entity/gate/
behaviour_u64.rs1use 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 {}