reactive_graph_std_object/behaviour/entity/
keys.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_std_object_model::ObjectKeysProperties::KEYS;
11use reactive_graph_std_object_model::ObjectKeysProperties::OBJECT;
12
13entity_behaviour!(ObjectKeys, ObjectKeysFactory, ObjectKeysFsm, ObjectKeysBehaviourTransitions, ObjectKeysValidator);
14
15behaviour_validator!(ObjectKeysValidator, Uuid, ReactiveEntity, OBJECT.as_ref(), KEYS.as_ref());
16
17impl BehaviourInit<Uuid, ReactiveEntity> for ObjectKeysBehaviourTransitions {
18    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
19        if let Some(object) = self.reactive_instance.get(OBJECT) {
20            if let Some(object) = object.as_object() {
21                self.reactive_instance.set(KEYS, json!(Vec::from_iter(object.keys())));
22            }
23        }
24        Ok(())
25    }
26}
27
28impl BehaviourConnect<Uuid, ReactiveEntity> for ObjectKeysBehaviourTransitions {
29    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
30        let reactive_instance = self.reactive_instance.clone();
31        self.property_observers.observe_with_handle(OBJECT.as_ref(), move |object: &Value| {
32            if let Some(object) = object.as_object() {
33                reactive_instance.set(KEYS, json!(Vec::from_iter(object.keys())));
34            }
35        });
36        Ok(())
37    }
38}
39
40impl BehaviourShutdown<Uuid, ReactiveEntity> for ObjectKeysBehaviourTransitions {}
41impl BehaviourTransitions<Uuid, ReactiveEntity> for ObjectKeysBehaviourTransitions {}