1use env_watcher::{EnvironmentWatcher, Error, Subscribe};
2use std::thread::sleep;
3use std::time::Duration;
4
5static TEST_VALUE: &'static str = "ONLY_TEST";
6static TEST_BY_CHANGE_VALUE: &'static str = "ONLY_TEST_CHANGE";
7
8fn fill_envs(envs: Vec<String>, val: &'static str) {
9 envs.iter().for_each(|k| {
10 std::env::set_var(k, &val);
11 });
12}
13
14fn print_after() {
15 println!();
16 println!("###################################################");
17 println!("############## SUB KEYS AFTER CHANGE ##############");
18 println!("###################################################");
19 println!();
20}
21
22fn print_before() {
23 println!();
24 println!("####################################################");
25 println!("############## SUB KEYS BEFORE CHANGE ##############");
26 println!("####################################################");
27 println!();
28}
29
30pub fn main() -> Result<(), Error> {
31 let sub_envs_key = vec!["test.bey".to_string(), "test.wow".to_string()];
32 fill_envs(sub_envs_key.clone(), TEST_VALUE);
33
34 let sub_envs = Subscribe::Envs(sub_envs_key.clone());
35
36 let sub_pattern_envs_key = vec![
37 "my.server.port".to_string(),
38 "my.server.host".to_string(),
39 "my.server.locale".to_string(),
40 "my.server.tls".to_string(),
41 ];
42 fill_envs(sub_pattern_envs_key.clone(), TEST_VALUE);
43
44 let sub_pattern_envs = Subscribe::PatternEnvs(vec!["^my.server.*".to_string()]);
45
46 let env_core = EnvironmentWatcher::new(Duration::from_secs(3));
47 sleep(Duration::from_secs(1));
48
49 let only_envs = env_core.subscribe_snapshot(sub_envs)?;
50
51 let envs_data = only_envs.data();
52 print_after();
53 println!("{:?}", &envs_data);
54 println!();
55
56 envs_data.iter().for_each(|kv| {
57 match &**kv.0 {
58 "test.bey" | "test.wow" => {
59 assert_eq!(TEST_VALUE, &**kv.1);
61 }
62 _ => {
63 println!("Find unknown key with value. {}, {}", &**kv.0, &**kv.1);
64 panic!("unknown k/v in pattern sub.");
65 }
66 }
67 });
68
69 let pattern_envs = env_core.subscribe_snapshot(sub_pattern_envs)?;
70
71 let pattern_data = pattern_envs.data();
72 println!("{:?}", &pattern_data);
73
74 pattern_data.iter().for_each(|kv| {
75 match &**kv.0 {
76 "my.server.port" | "my.server.host" | "my.server.locale" | "my.server.tls" => {
77 assert_eq!(TEST_VALUE, &**kv.1);
79 }
80 _ => {
81 println!("Find unknown key with value. {}, {}", &**kv.0, &**kv.1);
82 panic!("unknown k/v in pattern sub.");
83 }
84 }
85 });
86
87 fill_envs(sub_envs_key.clone(), TEST_BY_CHANGE_VALUE);
88 fill_envs(sub_pattern_envs_key.clone(), TEST_BY_CHANGE_VALUE);
89
90 sleep(Duration::from_secs(3));
91
92 print_before();
93 let envs_data = only_envs.data();
94 println!("{:?}", &envs_data);
95 println!();
96
97 envs_data.iter().for_each(|kv| {
98 match &**kv.0 {
99 "test.bey" | "test.wow" => {
100 assert_eq!(TEST_BY_CHANGE_VALUE, &**kv.1);
102 }
103 _ => {
104 println!("Find unknown key with value. {}, {}", &**kv.0, &**kv.1);
105 panic!("unknown k/v in pattern sub.");
106 }
107 }
108 });
109
110 let pattern_data = pattern_envs.data();
111 println!("{:?}", &pattern_data);
112
113 pattern_data.iter().for_each(|kv| {
114 match &**kv.0 {
115 "my.server.port" | "my.server.host" | "my.server.locale" | "my.server.tls" => {
116 assert_eq!(TEST_BY_CHANGE_VALUE, &**kv.1);
118 }
119 _ => {
120 println!("Find unknown key with value. {}, {}", &**kv.0, &**kv.1);
121 panic!("unknown k/v in pattern sub.");
122 }
123 }
124 });
125
126 Ok(())
127}