reactive_graph_std_array/behaviour/entity/
length.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::ArrayLengthProperties::ARRAY;
11use reactive_graph_std_array_model::ArrayLengthProperties::LENGTH;
12
13entity_behaviour!(ArrayLength, ArrayLengthFactory, ArrayLengthFsm, ArrayLengthBehaviourTransitions, ArrayLengthValidator);
14
15behaviour_validator!(ArrayLengthValidator, Uuid, ReactiveEntity, ARRAY.as_ref(), LENGTH.as_ref());
16
17impl BehaviourInit<Uuid, ReactiveEntity> for ArrayLengthBehaviourTransitions {
18    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
19        if let Some(array) = self.reactive_instance.as_array(ARRAY) {
20            self.reactive_instance.set(LENGTH, json!(array.len()));
21        }
22        Ok(())
23    }
24}
25
26impl BehaviourConnect<Uuid, ReactiveEntity> for ArrayLengthBehaviourTransitions {
27    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
28        let reactive_instance = self.reactive_instance.clone();
29        self.property_observers.observe_with_handle(ARRAY.as_ref(), move |array: &Value| {
30            if let Some(array) = array.as_array() {
31                reactive_instance.set(LENGTH, json!(array.len()));
32            }
33        });
34        Ok(())
35    }
36}
37
38impl BehaviourShutdown<Uuid, ReactiveEntity> for ArrayLengthBehaviourTransitions {}
39impl BehaviourTransitions<Uuid, ReactiveEntity> for ArrayLengthBehaviourTransitions {}