change_handler/
change_handler.rs1use 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 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 }
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}