reactive_graph_std_logical/behaviour/entity/
toggle.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 serde_json::json;
8use uuid::Uuid;
9
10use reactive_graph_runtime_model::ActionProperties::TRIGGER;
11use reactive_graph_std_result_model::ResultBooleanProperties::RESULT;
12
13entity_behaviour!(Toggle, ToggleFactory, ToggleFsm, ToggleBehaviourTransitions, ToggleValidator);
14
15behaviour_validator!(ToggleValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), RESULT.as_ref());
16
17impl BehaviourInit<Uuid, ReactiveEntity> for ToggleBehaviourTransitions {}
18
19impl BehaviourConnect<Uuid, ReactiveEntity> for ToggleBehaviourTransitions {
20    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
21        let reactive_instance = self.property_observers.reactive_instance.clone();
22        self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |trigger: &Value| {
23            if !trigger.as_bool().unwrap_or(false) {
24                return;
25            }
26            match reactive_instance.get(RESULT).and_then(|v| v.as_bool()) {
27                Some(current_state) => {
28                    reactive_instance.set(RESULT, json!(!current_state));
29                }
30                None => {
31                    reactive_instance.set(RESULT, json!(false));
32                }
33            }
34        });
35        Ok(())
36    }
37}
38
39impl BehaviourShutdown<Uuid, ReactiveEntity> for ToggleBehaviourTransitions {}
40impl BehaviourTransitions<Uuid, ReactiveEntity> for ToggleBehaviourTransitions {}