reactive_graph_std_random/behaviour/entity/
random_u64_pseudo.rs

1use rand::Rng;
2use rand_chacha::ChaCha8Rng;
3use rand_chacha::rand_core::SeedableRng;
4use reactive_graph_behaviour_model_api::behaviour_validator;
5use reactive_graph_behaviour_model_api::prelude::*;
6use reactive_graph_behaviour_model_impl::entity_behaviour;
7use reactive_graph_graph::prelude::*;
8use reactive_graph_reactive_model_impl::ReactiveEntity;
9use reactive_graph_runtime_model::ActionProperties::TRIGGER;
10use serde_json::Value;
11use serde_json::json;
12use uuid::Uuid;
13
14use reactive_graph_std_random_model::PseudoNumberGeneratorProperties::SEED;
15use reactive_graph_std_result_model::ResultNumberU64Properties::RESULT;
16
17entity_behaviour!(
18    RandomU64Pseudo,
19    RandomU64PseudoFactory,
20    RandomU64PseudoFsm,
21    RandomU64PseudoBehaviourTransitions,
22    RandomU64PseudoValidator
23);
24
25behaviour_validator!(RandomU64PseudoValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), SEED.as_ref(), RESULT.as_ref());
26
27impl BehaviourInit<Uuid, ReactiveEntity> for RandomU64PseudoBehaviourTransitions {}
28
29impl BehaviourConnect<Uuid, ReactiveEntity> for RandomU64PseudoBehaviourTransitions {
30    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
31        let Some(seed) = self.reactive_instance.as_u64(SEED) else {
32            return Err(BehaviourConnectFailed {});
33        };
34        let mut rng = ChaCha8Rng::seed_from_u64(seed);
35        let reactive_instance = self.reactive_instance.clone();
36        self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |trigger: &Value| {
37            if !trigger.as_bool().unwrap_or(false) {
38                return;
39            }
40            reactive_instance.set(RESULT, random(&mut rng));
41        });
42        Ok(())
43    }
44}
45
46impl BehaviourShutdown<Uuid, ReactiveEntity> for RandomU64PseudoBehaviourTransitions {}
47impl BehaviourTransitions<Uuid, ReactiveEntity> for RandomU64PseudoBehaviourTransitions {}
48
49fn random(rng: &mut ChaCha8Rng) -> Value {
50    json!(rng.random::<u64>())
51}