reactive_graph_std_logical/behaviour/entity/operation/
mod.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::Value;
7use serde_json::json;
8use uuid::Uuid;
9
10pub use function::LogicalOperationFunction;
11
12use reactive_graph_std_logical_model::LogicalOperationProperties::LHS;
13use reactive_graph_std_result_model::ResultBooleanProperties::RESULT;
14
15pub mod function;
16
17entity_behaviour!(
18 LogicalOperation,
19 LogicalOperationFactory,
20 LogicalOperationFsm,
21 LogicalOperationBehaviourTransitions,
22 LogicalOperationValidator,
23 f,
24 LogicalOperationFunction
25);
26
27behaviour_validator!(LogicalOperationValidator, Uuid, ReactiveEntity, LHS.as_ref(), RESULT.as_ref());
28
29impl BehaviourInit<Uuid, ReactiveEntity> for LogicalOperationBehaviourTransitions {
30 fn init(&self) -> Result<(), BehaviourInitializationFailed> {
31 let lhs = self
32 .reactive_instance
33 .get(LHS)
34 .and_then(|v| v.as_bool())
35 .ok_or(BehaviourInitializationFailed {})?;
36 let f = self.f;
37 self.reactive_instance.set(RESULT, json!(f(lhs)));
38 Ok(())
39 }
40}
41
42impl BehaviourConnect<Uuid, ReactiveEntity> for LogicalOperationBehaviourTransitions {
43 fn connect(&self) -> Result<(), BehaviourConnectFailed> {
44 let reactive_instance = self.reactive_instance.clone();
45 let f = self.f;
46 self.property_observers.observe_with_handle(LHS.as_ref(), move |v: &Value| {
47 if let Some(v) = v.as_bool() {
48 reactive_instance.set(RESULT, json!(f(v)));
49 }
50 });
51 Ok(())
52 }
53}
54
55impl BehaviourShutdown<Uuid, ReactiveEntity> for LogicalOperationBehaviourTransitions {}
56impl BehaviourTransitions<Uuid, ReactiveEntity> for LogicalOperationBehaviourTransitions {}