reactive_graph_std_object/behaviour/entity/
remove_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::ObjectRemovePropertyProperties::OBJECT;
10use reactive_graph_std_object_model::ObjectRemovePropertyProperties::PROPERTY_NAME;
11use reactive_graph_std_result_model::ResultAnyProperties::RESULT;
12
13entity_behaviour!(
14    ObjectRemoveProperty,
15    ObjectRemovePropertyFactory,
16    ObjectRemovePropertyFsm,
17    ObjectRemovePropertyBehaviourTransitions,
18    ObjectRemovePropertyValidator
19);
20
21behaviour_validator!(ObjectRemovePropertyValidator, Uuid, ReactiveEntity, OBJECT.as_ref(), RESULT.as_ref(), PROPERTY_NAME.as_ref());
22
23impl BehaviourInit<Uuid, ReactiveEntity> for ObjectRemovePropertyBehaviourTransitions {
24    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
25        if let Some(mut object) = self.reactive_instance.as_object(OBJECT) {
26            if let Some(property_name) = self.reactive_instance.as_string(PROPERTY_NAME) {
27                object.remove(&property_name);
28                self.reactive_instance.set(RESULT, Value::Object(object));
29            }
30        }
31        Ok(())
32    }
33}
34
35impl BehaviourConnect<Uuid, ReactiveEntity> for ObjectRemovePropertyBehaviourTransitions {
36    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
37        let reactive_instance = self.reactive_instance.clone();
38        self.property_observers.observe_with_handle(OBJECT.as_ref(), move |object: &Value| {
39            if let Some(mut object) = object.as_object().cloned() {
40                if let Some(property_name) = reactive_instance.as_string(PROPERTY_NAME) {
41                    object.remove(&property_name);
42                    reactive_instance.set(RESULT, Value::Object(object));
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(property_name) = property_name.as_str().map(String::from) {
50                    if let Some(mut object) = reactive_instance.as_object(OBJECT) {
51                        object.remove(&property_name);
52                        reactive_instance.set(RESULT, Value::Object(object));
53                    }
54                }
55            });
56        Ok(())
57    }
58}
59
60impl BehaviourShutdown<Uuid, ReactiveEntity> for ObjectRemovePropertyBehaviourTransitions {}
61impl BehaviourTransitions<Uuid, ReactiveEntity> for ObjectRemovePropertyBehaviourTransitions {}