reactive_graph_std_array/behaviour/entity/
reverse.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_array_model::ArrayReverseProperties::ARRAY;
10use reactive_graph_std_result_model::ResultArrayProperties::RESULT;
11
12entity_behaviour!(ArrayReverse, ArrayReverseFactory, ArrayReverseFsm, ArrayReverseBehaviourTransitions, ArrayReverseValidator);
13
14behaviour_validator!(ArrayReverseValidator, Uuid, ReactiveEntity, ARRAY.as_ref(), RESULT.as_ref());
15
16impl BehaviourInit<Uuid, ReactiveEntity> for ArrayReverseBehaviourTransitions {
17    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
18        if let Some(array) = self.reactive_instance.as_array(ARRAY) {
19            self.reactive_instance.set(RESULT, reverse_array(&array));
20        }
21        Ok(())
22    }
23}
24
25impl BehaviourConnect<Uuid, ReactiveEntity> for ArrayReverseBehaviourTransitions {
26    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
27        let reactive_instance = self.reactive_instance.clone();
28        self.property_observers.observe_with_handle(ARRAY.as_ref(), move |array: &Value| {
29            if let Some(array) = array.as_array() {
30                reactive_instance.set(RESULT, reverse_array(array));
31            }
32        });
33        Ok(())
34    }
35}
36
37fn reverse_array(array: &[Value]) -> Value {
38    Value::Array(array.iter().rev().cloned().collect())
39}
40
41impl BehaviourShutdown<Uuid, ReactiveEntity> for ArrayReverseBehaviourTransitions {}
42impl BehaviourTransitions<Uuid, ReactiveEntity> for ArrayReverseBehaviourTransitions {}