reactive_graph_std_logical/behaviour/entity/
if_then_else.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::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                // Invalid type, do nothing!
47                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 {}