reactive_graph_std_random/behaviour/entity/
random_i64_pseudo.rs1use 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::ResultNumberI64Properties::RESULT;
16
17entity_behaviour!(
18 RandomI64Pseudo,
19 RandomI64PseudoFactory,
20 RandomI64PseudoFsm,
21 RandomI64PseudoBehaviourTransitions,
22 RandomI64PseudoValidator
23);
24
25behaviour_validator!(RandomI64PseudoValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), SEED.as_ref(), RESULT.as_ref());
26
27impl BehaviourInit<Uuid, ReactiveEntity> for RandomI64PseudoBehaviourTransitions {}
28
29impl BehaviourConnect<Uuid, ReactiveEntity> for RandomI64PseudoBehaviourTransitions {
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 RandomI64PseudoBehaviourTransitions {}
47impl BehaviourTransitions<Uuid, ReactiveEntity> for RandomI64PseudoBehaviourTransitions {}
48
49fn random(rng: &mut ChaCha8Rng) -> Value {
50 json!(rng.random::<i64>())
51}