reactive_graph_std_random/behaviour/entity/
random_i64.rs

1use rand::Rng;
2use reactive_graph_behaviour_model_api::behaviour_validator;
3use reactive_graph_behaviour_model_api::prelude::*;
4use reactive_graph_behaviour_model_impl::entity_behaviour;
5use reactive_graph_graph::prelude::*;
6use reactive_graph_reactive_model_impl::ReactiveEntity;
7use reactive_graph_runtime_model::ActionProperties::TRIGGER;
8use serde_json::Value;
9use serde_json::json;
10use uuid::Uuid;
11
12use reactive_graph_std_result_model::ResultNumberI64Properties::RESULT;
13
14entity_behaviour!(RandomI64, RandomI64Factory, RandomI64Fsm, RandomI64BehaviourTransitions, RandomI64Validator);
15
16behaviour_validator!(RandomI64Validator, Uuid, ReactiveEntity, TRIGGER.as_ref(), RESULT.as_ref());
17
18impl BehaviourInit<Uuid, ReactiveEntity> for RandomI64BehaviourTransitions {
19    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
20        if self.reactive_instance.as_bool(TRIGGER).unwrap_or(false) {
21            self.reactive_instance.set(RESULT, random());
22        }
23        Ok(())
24    }
25}
26
27impl BehaviourConnect<Uuid, ReactiveEntity> for RandomI64BehaviourTransitions {
28    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
29        let reactive_instance = self.reactive_instance.clone();
30        self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |trigger: &Value| {
31            if !trigger.as_bool().unwrap_or(false) {
32                return;
33            }
34            reactive_instance.set(RESULT, random());
35        });
36        Ok(())
37    }
38}
39
40impl BehaviourShutdown<Uuid, ReactiveEntity> for RandomI64BehaviourTransitions {}
41impl BehaviourTransitions<Uuid, ReactiveEntity> for RandomI64BehaviourTransitions {}
42
43fn random() -> Value {
44    let mut rng = rand::rng();
45    json!(rng.random::<i64>())
46}