reactive_graph_std_object/behaviour/entity/
set_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::ObjectSetPropertyProperties::OBJECT;
10use reactive_graph_std_object_model::ObjectSetPropertyProperties::PROPERTY_NAME;
11use reactive_graph_std_object_model::ObjectSetPropertyProperties::VALUE;
12use reactive_graph_std_result_model::ResultAnyProperties::RESULT;
13
14entity_behaviour!(
15    ObjectSetProperty,
16    ObjectSetPropertyFactory,
17    ObjectSetPropertyFsm,
18    ObjectSetPropertyBehaviourTransitions,
19    ObjectSetPropertyValidator
20);
21
22behaviour_validator!(
23    ObjectSetPropertyValidator,
24    Uuid,
25    ReactiveEntity,
26    OBJECT.as_ref(),
27    RESULT.as_ref(),
28    VALUE.as_ref(),
29    PROPERTY_NAME.as_ref()
30);
31
32impl BehaviourInit<Uuid, ReactiveEntity> for ObjectSetPropertyBehaviourTransitions {
33    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
34        if let Some(mut object) = self.reactive_instance.as_object(OBJECT) {
35            if let Some(property_name) = self.reactive_instance.as_string(PROPERTY_NAME) {
36                if let Some(value) = self.reactive_instance.get(VALUE) {
37                    if object.contains_key(&property_name) {
38                        object[&property_name] = value;
39                    } else {
40                        object.insert(property_name, value.clone());
41                    }
42                    self.reactive_instance.set(RESULT, Value::Object(object));
43                }
44            }
45        }
46        Ok(())
47    }
48}
49
50impl BehaviourConnect<Uuid, ReactiveEntity> for ObjectSetPropertyBehaviourTransitions {
51    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
52        let reactive_instance = self.reactive_instance.clone();
53        self.property_observers.observe_with_handle(OBJECT.as_ref(), move |object: &Value| {
54            if let Some(mut object) = object.as_object().cloned() {
55                if let Some(property_name) = reactive_instance.as_string(PROPERTY_NAME) {
56                    if let Some(value) = reactive_instance.get(VALUE) {
57                        if object.contains_key(&property_name) {
58                            object[&property_name] = value;
59                        } else {
60                            object.insert(property_name, value.clone());
61                        }
62                        reactive_instance.set(RESULT, Value::Object(object));
63                    }
64                }
65            }
66        });
67        let reactive_instance = self.reactive_instance.clone();
68        self.property_observers
69            .observe_with_handle(PROPERTY_NAME.as_ref(), move |property_name: &Value| {
70                if let Some(property_name) = property_name.as_str().map(String::from) {
71                    if let Some(mut object) = reactive_instance.as_object(OBJECT) {
72                        if let Some(value) = reactive_instance.get(VALUE) {
73                            if object.contains_key(&property_name) {
74                                object[&property_name] = value;
75                            } else {
76                                object.insert(property_name, value.clone());
77                            }
78                            reactive_instance.set(RESULT, Value::Object(object));
79                        }
80                    }
81                }
82            });
83        let reactive_instance = self.reactive_instance.clone();
84        self.property_observers.observe_with_handle(VALUE.as_ref(), move |value: &Value| {
85            if let Some(mut object) = reactive_instance.as_object(OBJECT) {
86                if let Some(property_name) = reactive_instance.as_string(PROPERTY_NAME) {
87                    if object.contains_key(&property_name) {
88                        object[&property_name] = value.clone();
89                    } else {
90                        object.insert(property_name, value.clone());
91                    }
92                    reactive_instance.set(RESULT, Value::Object(object));
93                }
94            }
95        });
96        Ok(())
97    }
98}
99
100impl BehaviourShutdown<Uuid, ReactiveEntity> for ObjectSetPropertyBehaviourTransitions {}
101impl BehaviourTransitions<Uuid, ReactiveEntity> for ObjectSetPropertyBehaviourTransitions {}