reactive_graph_sys_json/behaviour/component/
load_json.rs

1use std::fs::File;
2use std::path::Path;
3
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_std_result_model::ResultAnyProperties::RESULT;
14use reactive_graph_sys_file_model::FileProperties::FILENAME;
15
16entity_behaviour!(LoadJson, LoadJsonFactory, LoadJsonFsm, LoadJsonBehaviourTransitions, LoadJsonValidator);
17
18behaviour_validator!(LoadJsonValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), RESULT.as_ref());
19
20impl BehaviourInit<Uuid, ReactiveEntity> for LoadJsonBehaviourTransitions {
21    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
22        if self.reactive_instance.as_bool(TRIGGER).unwrap_or(false) {
23            if let Some(filename) = self.reactive_instance.as_string(FILENAME) {
24                if let Some(value) = load_json(filename) {
25                    self.reactive_instance.set(RESULT, value);
26                }
27            }
28        }
29        Ok(())
30    }
31}
32
33impl BehaviourConnect<Uuid, ReactiveEntity> for LoadJsonBehaviourTransitions {
34    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
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            if let Some(filename) = reactive_instance.as_string(FILENAME) {
41                if let Some(value) = load_json(filename) {
42                    reactive_instance.set(RESULT, value);
43                }
44            }
45        });
46        Ok(())
47    }
48}
49
50impl BehaviourShutdown<Uuid, ReactiveEntity> for LoadJsonBehaviourTransitions {}
51impl BehaviourTransitions<Uuid, ReactiveEntity> for LoadJsonBehaviourTransitions {}
52
53fn load_json(filename: String) -> Option<Value> {
54    match File::open(Path::new(shellexpand::tilde(&filename).as_ref())) {
55        Ok(file) => serde_json::from_reader(file).ok(),
56        Err(_) => None,
57    }
58}