reactive_graph_std_object/behaviour/entity/
get_property.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_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}