reactive_graph_std_object/behaviour/entity/
get_property.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_object_model::ObjectGetPropertyProperties::OBJECT;
10use reactive_graph_std_object_model::ObjectGetPropertyProperties::PROPERTY_NAME;
11use reactive_graph_std_result_model::ResultAnyProperties::RESULT;
12
13entity_behaviour!(
14    ObjectGetProperty,
15    ObjectGetPropertyFactory,
16    ObjectGetPropertyFsm,
17    ObjectGetPropertyBehaviourTransitions,
18    ObjectGetPropertyValidator
19);
20
21behaviour_validator!(ObjectGetPropertyValidator, Uuid, ReactiveEntity, OBJECT.as_ref(), RESULT.as_ref(), PROPERTY_NAME.as_ref());
22
23impl BehaviourInit<Uuid, ReactiveEntity> for ObjectGetPropertyBehaviourTransitions {
24    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
25        if let Some(object) = self.reactive_instance.get(OBJECT) {
26            if let Some(property_name) = self.reactive_instance.get(PROPERTY_NAME) {
27                if let Some(result) = get_property_by_name(&object, &property_name) {
28                    self.reactive_instance.set(RESULT, result);
29                }
30            }
31        }
32        Ok(())
33    }
34}
35
36impl BehaviourConnect<Uuid, ReactiveEntity> for ObjectGetPropertyBehaviourTransitions {
37    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
38        let reactive_instance = self.reactive_instance.clone();
39        self.property_observers.observe_with_handle(OBJECT.as_ref(), move |object: &Value| {
40            if let Some(property_name) = reactive_instance.get(PROPERTY_NAME) {
41                if let Some(result) = get_property_by_name(object, &property_name) {
42                    reactive_instance.set(RESULT, result);
43                }
44            }
45        });
46        let reactive_instance = self.reactive_instance.clone();
47        self.property_observers
48            .observe_with_handle(PROPERTY_NAME.as_ref(), move |property_name: &Value| {
49                if let Some(object) = reactive_instance.get(OBJECT) {
50                    if let Some(result) = get_property_by_name(&object, property_name) {
51                        reactive_instance.set(RESULT, result);
52                    }
53                }
54            });
55        Ok(())
56    }
57}
58
59impl BehaviourShutdown<Uuid, ReactiveEntity> for ObjectGetPropertyBehaviourTransitions {}
60impl BehaviourTransitions<Uuid, ReactiveEntity> for ObjectGetPropertyBehaviourTransitions {}
61
62fn get_property_by_name(object: &Value, property_name: &Value) -> Option<Value> {
63    match property_name.as_str() {
64        Some(property_name) => match object.as_object() {
65            Some(object) => object.get(property_name).cloned(),
66            None => None,
67        },
68        _ => None,
69    }
70}