change_handler/
change_handler.rs

1use env_watcher::{ChangeState, EnvironmentWatcher, Error, Subscribe};
2use std::collections::HashMap;
3use std::env::{remove_var, set_var};
4use std::thread::sleep;
5use std::time::Duration;
6
7static TEST_VALUE: &'static str = "ONLY_TEST";
8
9fn fill_envs(envs: Vec<String>, val: &'static str) {
10    envs.iter().for_each(|k| {
11        std::env::set_var(k, &val);
12    });
13}
14
15fn print_after() {
16    println!();
17    println!("###################################################");
18    println!("############## SUB KEYS AFTER CHANGE ##############");
19    println!("###################################################");
20    println!();
21}
22
23fn print_before() {
24    println!();
25    println!("####################################################");
26    println!("############## SUB KEYS BEFORE CHANGE ##############");
27    println!("####################################################");
28    println!();
29}
30
31pub fn main() -> Result<(), Error> {
32    let sub_envs_key = vec![
33        "server.port".to_string(),
34        "server.address".to_string(),
35        "server.tls".to_string(),
36    ];
37    fill_envs(sub_envs_key.clone(), TEST_VALUE);
38
39    let env_core = EnvironmentWatcher::default();
40    sleep(Duration::from_secs(1));
41
42    let sub_envs = Subscribe::Envs(sub_envs_key.clone());
43    let only_envs = env_core.subscribe(sub_envs)?;
44
45    print_after();
46
47    let mut data = only_envs.0;
48
49    println!("{:?}", &data);
50
51    let rec = only_envs.1;
52
53    let mut event_count = 0;
54    loop {
55        // Change env state.
56        if event_count == 0 {
57            set_var("server.port", "2013");
58        } else if event_count == 1 {
59            set_var("server.address", "localhost");
60        } else if event_count == 2 {
61            remove_var("server.tls");
62        }
63
64        let event = rec.recv().unwrap();
65
66        match event {
67            ChangeState::Edit(k, v) => {
68                match &*k {
69                    "server.port" => {
70                        assert_eq!("2013", &*v);
71                        data.insert(k, v);
72                        restart_server(&data);
73                    }
74                    "server.address" => {
75                        assert_eq!("localhost", &*v);
76                        data.insert(k, v);
77                        restart_server(&data);
78                    }
79                    _ => {
80                        // ignore
81                    }
82                }
83            }
84            ChangeState::Delete(k) => {
85                assert_eq!("server.tls", &*k);
86                data.remove(&k);
87                restart_server(&data);
88            }
89        }
90
91        event_count = event_count + 1;
92
93        if event_count >= 3 {
94            break;
95        }
96    }
97
98    Ok(())
99}
100
101fn restart_server(data: &HashMap<String, String>) {
102    print_before();
103    println!("{:?}", data);
104
105    println!("Server has been restart.")
106}