reactive_graph_std_logical/behaviour/entity/
if_then_else.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 uuid::Uuid;
8
9use reactive_graph_std_logical_model::ConditionProperties::CONDITION;
10use reactive_graph_std_logical_model::IfThenElseProperties::ELSE_PAYLOAD;
11use reactive_graph_std_logical_model::IfThenElseProperties::THEN_PAYLOAD;
12use reactive_graph_std_result_model::ResultAnyProperties::RESULT;
13
14entity_behaviour!(IfThenElse, IfThenElseFactory, IfThenElseFsm, IfThenElseBehaviourTransitions, IfThenElseValidator);
15
16behaviour_validator!(
17 IfThenElseValidator,
18 Uuid,
19 ReactiveEntity,
20 CONDITION.as_ref(),
21 THEN_PAYLOAD.as_ref(),
22 ELSE_PAYLOAD.as_ref(),
23 RESULT.as_ref()
24);
25
26impl BehaviourInit<Uuid, ReactiveEntity> for IfThenElseBehaviourTransitions {
27 fn init(&self) -> Result<(), BehaviourInitializationFailed> {
28 let condition = self
29 .reactive_instance
30 .get(CONDITION)
31 .and_then(|v| v.as_bool())
32 .ok_or(BehaviourInitializationFailed {})?;
33 let payload_property = if condition { THEN_PAYLOAD } else { ELSE_PAYLOAD };
34 if let Some(payload) = self.reactive_instance.get(payload_property) {
35 self.reactive_instance.set(RESULT, payload);
36 }
37 Ok(())
38 }
39}
40
41impl BehaviourConnect<Uuid, ReactiveEntity> for IfThenElseBehaviourTransitions {
42 fn connect(&self) -> Result<(), BehaviourConnectFailed> {
43 let reactive_instance = self.reactive_instance.clone();
44 self.property_observers.observe_with_handle(CONDITION.as_ref(), move |v: &Value| {
45 if !v.is_boolean() {
46 return;
48 }
49 let payload_property = if v.as_bool().unwrap() { THEN_PAYLOAD } else { ELSE_PAYLOAD };
50 if let Some(payload) = reactive_instance.get(payload_property) {
51 reactive_instance.set(RESULT, payload);
52 }
53 });
54 Ok(())
55 }
56}
57
58impl BehaviourShutdown<Uuid, ReactiveEntity> for IfThenElseBehaviourTransitions {}
59impl BehaviourTransitions<Uuid, ReactiveEntity> for IfThenElseBehaviourTransitions {}