reactive_graph_std_object/behaviour/entity/
set_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::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 {}