reactive_graph_sys_json/behaviour/component/
save_json.rs

1use std::fs::File;
2
3use log::trace;
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 uuid::Uuid;
12
13use reactive_graph_sys_file_model::FileProperties::FILENAME;
14use reactive_graph_sys_json_model::SaveJsonProperties::PAYLOAD;
15
16entity_behaviour!(SaveJson, SaveJsonFactory, SaveJsonFsm, SaveJsonBehaviourTransitions, SaveJsonValidator);
17
18behaviour_validator!(SaveJsonValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), FILENAME.as_ref(), PAYLOAD.as_ref());
19
20impl BehaviourInit<Uuid, ReactiveEntity> for SaveJsonBehaviourTransitions {}
21
22impl BehaviourConnect<Uuid, ReactiveEntity> for SaveJsonBehaviourTransitions {
23    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
24        let reactive_instance = self.reactive_instance.clone();
25        self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |trigger: &Value| {
26            if !trigger.as_bool().unwrap_or(false) {
27                return;
28            }
29            if let Some(filename) = reactive_instance.get(FILENAME).and_then(|v| v.as_str().map(String::from)) {
30                match File::open(&filename) {
31                    Ok(file) => {
32                        if let Some(value) = reactive_instance.get(PAYLOAD) {
33                            if serde_json::to_writer_pretty(file, &value).is_ok() {
34                                trace!("Wrote payload to existing file {filename}");
35                            }
36                        }
37                    }
38                    Err(_) => {
39                        if let Ok(file) = File::create(&filename) {
40                            if let Some(value) = reactive_instance.get(PAYLOAD) {
41                                if serde_json::to_writer_pretty(file, &value).is_ok() {
42                                    trace!("Wrote payload to new file {filename}");
43                                }
44                            }
45                        }
46                    }
47                }
48            }
49        });
50        Ok(())
51    }
52}
53
54impl BehaviourShutdown<Uuid, ReactiveEntity> for SaveJsonBehaviourTransitions {}
55impl BehaviourTransitions<Uuid, ReactiveEntity> for SaveJsonBehaviourTransitions {}