reactive_graph_std_date_time/behaviour/entity/
utc_timestamp.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 reactive_graph_runtime_model::ActionProperties::TRIGGER;
7use serde_json::Value;
8use serde_json::json;
9use uuid::Uuid;
10
11use reactive_graph_std_result_model::ResultNumberU64Properties::RESULT;
12
13entity_behaviour!(UtcTimestamp, UtcTimestampFactory, UtcTimestampFsm, UtcTimestampBehaviourTransitions, UtcTimestampValidator);
14
15behaviour_validator!(UtcTimestampValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), RESULT.as_ref());
16
17impl BehaviourInit<Uuid, ReactiveEntity> for UtcTimestampBehaviourTransitions {
18    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
19        if let Some(trigger) = self.reactive_instance.get(TRIGGER) {
20            if trigger.as_bool().unwrap_or(false) {
21                self.reactive_instance.set(RESULT, json!(chrono::Utc::now().timestamp()));
22            }
23        }
24        Ok(())
25    }
26}
27
28impl BehaviourConnect<Uuid, ReactiveEntity> for UtcTimestampBehaviourTransitions {
29    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
30        let reactive_instance = self.reactive_instance.clone();
31        self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |trigger: &Value| {
32            if !trigger.as_bool().unwrap_or(false) {
33                return;
34            }
35            reactive_instance.set(RESULT, json!(chrono::Utc::now().timestamp()));
36        });
37        Ok(())
38    }
39}
40
41impl BehaviourShutdown<Uuid, ReactiveEntity> for UtcTimestampBehaviourTransitions {}
42impl BehaviourTransitions<Uuid, ReactiveEntity> for UtcTimestampBehaviourTransitions {}