code0_flow/flow_config/
mod.rs1use std::{fmt::Debug, str::FromStr};
2
3pub mod environment;
4pub mod mode;
5
6pub fn env_with_default<T: FromStr + Debug>(key: &str, default: T) -> T {
7 match std::env::var(key) {
8 Ok(string) => match T::from_str(&string) {
9 Ok(value) => {
10 log::info!("Found env: {} with value: {:?}", key, &value);
11 value
12 }
13 Err(_) => {
14 log::warn!("Failed to parse env: {} with value: {:?}", key, &string);
15 default
16 }
17 },
18 Err(_) => {
19 log::warn!("Failed to find env: {}", key);
20 default
21 }
22 }
23}
24
25pub fn load_env_file() {
26 match dotenv::dotenv() {
27 Ok(path) => log::info!("Found Env. file at {:?} ", path),
28 Err(e) => log::error!("Failed to load .env file. Reason: {:?}", e),
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35 use serial_test::serial;
36 use std::env;
37
38 #[test]
39 #[serial]
40 fn test_env_with_default_string_exists() {
41 let key = "TEST_STRING_VAR";
42 let expected = "test_value";
43
44 unsafe {
45 env::set_var(key, expected);
46 }
47
48 let result = env_with_default(key, "default".to_string());
49 assert_eq!(result, expected);
50
51 unsafe {
52 env::remove_var(key);
53 }
54 }
55
56 #[test]
57 #[serial]
58 fn test_env_with_default_string_missing() {
59 let key = "TEST_MISSING_STRING_VAR";
60 unsafe {
61 env::remove_var(key);
62 }
63
64 let default = "default_value".to_string();
65 let result = env_with_default(key, default.clone());
66 assert_eq!(result, default);
67 }
68
69 #[test]
70 #[serial]
71 fn test_env_with_default_integer_exists() {
72 let key = "TEST_INT_VAR";
73 let expected = 42;
74 unsafe {
75 env::set_var(key, expected.to_string());
76 }
77
78 let result = env_with_default(key, 0i32);
79 assert_eq!(result, expected);
80
81 unsafe {
82 env::remove_var(key);
83 }
84 }
85
86 #[test]
87 #[serial]
88 fn test_env_with_default_integer_missing() {
89 let key = "TEST_MISSING_INT_VAR";
90 unsafe {
91 env::remove_var(key);
92 }
93
94 let default = 123i32;
95 let result = env_with_default(key, default);
96 assert_eq!(result, default);
97 }
98
99 #[test]
100 #[serial]
101 fn test_env_with_default_boolean_exists_true() {
102 let key = "TEST_BOOL_TRUE_VAR";
103 unsafe {
104 env::set_var(key, "true");
105 }
106
107 let result = env_with_default(key, false);
108 assert_eq!(result, true);
109
110 unsafe {
111 env::remove_var(key);
112 }
113 }
114
115 #[test]
116 #[serial]
117 fn test_env_with_default_boolean_exists_false() {
118 let key = "TEST_BOOL_FALSE_VAR";
119 unsafe {
120 env::set_var(key, "false");
121 }
122
123 let result = env_with_default(key, true);
124 assert_eq!(result, false);
125
126 unsafe {
127 env::remove_var(key);
128 }
129 }
130
131 #[test]
132 #[serial]
133 fn test_env_with_default_boolean_missing() {
134 let key = "TEST_MISSING_BOOL_VAR";
135 unsafe {
136 env::remove_var(key);
137 }
138
139 let default = true;
140 let result = env_with_default(key, default);
141 assert_eq!(result, default);
142 }
143
144 #[test]
145 #[serial]
146 fn test_env_with_default_boolean_invalid() {
147 let key = "TEST_INVALID_BOOL_VAR";
148 unsafe {
149 env::set_var(key, "maybe");
150 }
151
152 let result = env_with_default(key, false);
153 assert_eq!(result, false);
154
155 unsafe {
156 env::remove_var(key);
157 }
158 }
159
160 #[test]
161 #[serial]
162 fn test_env_with_default_u32_exists() {
163 let key = "TEST_U32_VAR";
164 let expected = 42u32;
165 unsafe {
166 env::set_var(key, expected.to_string());
167 }
168
169 let result = env_with_default(key, 0u32);
170 assert_eq!(result, expected);
171
172 unsafe {
173 env::remove_var(key);
174 }
175 }
176
177 #[test]
178 #[serial]
179 fn test_env_with_default_u32_negative_invalid() {
180 let key = "TEST_U32_NEGATIVE_VAR";
181 unsafe {
182 env::set_var(key, "-42");
183 }
184
185 let result = env_with_default(key, 0u32);
186 assert_eq!(result, 0u32);
187
188 unsafe {
189 env::remove_var(key);
190 }
191 }
192
193 #[test]
194 #[serial]
195 fn test_env_with_default_empty_string() {
196 let key = "TEST_EMPTY_STRING_VAR";
197 unsafe {
198 env::set_var(key, "");
199 }
200
201 let result = env_with_default(key, "default".to_string());
202 assert_eq!(result, "");
203
204 unsafe {
205 env::remove_var(key);
206 }
207 }
208
209 #[test]
210 #[serial]
211 fn test_env_with_default_whitespace_string() {
212 let key = "TEST_WHITESPACE_VAR";
213 unsafe {
214 env::set_var(key, " whitespace ");
215 }
216
217 let result = env_with_default(key, "default".to_string());
218 assert_eq!(result, " whitespace ");
219
220 unsafe {
221 env::remove_var(key);
222 }
223 }
224
225 #[test]
226 #[serial]
227 fn test_env_with_environment() {
228 let key = "TEST_ENVIRONMENT";
229 unsafe {
230 env::set_var(key, "DEVELOPMENT");
231 }
232
233 let result = env_with_default(key, environment::Environment::Development);
234 assert_eq!(result, environment::Environment::Development);
235
236 unsafe {
237 env::remove_var(key);
238 }
239 }
240
241 #[test]
242 #[serial]
243 fn test_env_with_mode() {
244 let key = "TEST_MODE";
245 unsafe {
246 env::set_var(key, "STATIC");
247 }
248
249 let result = env_with_default(key, mode::Mode::STATIC);
250 assert_eq!(result, mode::Mode::STATIC);
251
252 unsafe {
253 env::remove_var(key);
254 }
255 }
256}