reactive_graph_std_array/behaviour/entity/
contains.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 serde_json::json;
8use uuid::Uuid;
9
10use reactive_graph_std_array_model::ArrayContainsProperties::ARRAY;
11use reactive_graph_std_array_model::ArrayContainsProperties::SEARCH;
12use reactive_graph_std_result_model::ResultArrayProperties::RESULT;
13
14entity_behaviour!(
15    ArrayContains,
16    ArrayContainsFactory,
17    ArrayContainsFsm,
18    ArrayContainsBehaviourTransitions,
19    ArrayContainsValidator
20);
21
22behaviour_validator!(ArrayContainsValidator, Uuid, ReactiveEntity, ARRAY.as_ref(), RESULT.as_ref(), SEARCH.as_ref());
23
24impl BehaviourInit<Uuid, ReactiveEntity> for ArrayContainsBehaviourTransitions {
25    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
26        if let Some(array) = self.reactive_instance.get(ARRAY) {
27            if let Some(search) = self.reactive_instance.get(SEARCH) {
28                if let Some(result) = array_contains(&array, &search) {
29                    self.reactive_instance.set(RESULT, result);
30                }
31            }
32        }
33        Ok(())
34    }
35}
36
37impl BehaviourConnect<Uuid, ReactiveEntity> for ArrayContainsBehaviourTransitions {
38    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
39        let reactive_instance = self.reactive_instance.clone();
40        self.property_observers.observe_with_handle(ARRAY.as_ref(), move |array: &Value| {
41            if let Some(search) = reactive_instance.get(SEARCH) {
42                if let Some(result) = array_contains(array, &search) {
43                    reactive_instance.set(RESULT, result);
44                }
45            }
46        });
47        let reactive_instance = self.reactive_instance.clone();
48        self.property_observers.observe_with_handle(SEARCH.as_ref(), move |search: &Value| {
49            if let Some(array) = reactive_instance.get(ARRAY) {
50                if let Some(result) = array_contains(&array, search) {
51                    reactive_instance.set(RESULT, result);
52                }
53            }
54        });
55        Ok(())
56    }
57}
58
59impl BehaviourShutdown<Uuid, ReactiveEntity> for ArrayContainsBehaviourTransitions {}
60impl BehaviourTransitions<Uuid, ReactiveEntity> for ArrayContainsBehaviourTransitions {}
61
62fn array_contains(array: &Value, search: &Value) -> Option<Value> {
63    array.as_array().map(|array| json!(array.contains(search)))
64}