code0_flow/flow_config/
mod.rs

1use 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 std::env;
36
37    #[test]
38    fn test_env_with_default_string_exists() {
39        let key = "TEST_STRING_VAR";
40        let expected = "test_value";
41
42        unsafe {
43            env::set_var(key, expected);
44        }
45
46        let result = env_with_default(key, "default".to_string());
47        assert_eq!(result, expected);
48
49        unsafe {
50            env::remove_var(key);
51        }
52    }
53
54    #[test]
55    fn test_env_with_default_string_missing() {
56        let key = "TEST_MISSING_STRING_VAR";
57        unsafe {
58            env::remove_var(key);
59        }
60
61        let default = "default_value".to_string();
62        let result = env_with_default(key, default.clone());
63        assert_eq!(result, default);
64    }
65
66    #[test]
67    fn test_env_with_default_integer_exists() {
68        let key = "TEST_INT_VAR";
69        let expected = 42;
70        unsafe {
71            env::set_var(key, expected.to_string());
72        }
73
74        let result = env_with_default(key, 0i32);
75        assert_eq!(result, expected);
76
77        unsafe {
78            env::remove_var(key);
79        }
80    }
81
82    #[test]
83    fn test_env_with_default_integer_missing() {
84        let key = "TEST_MISSING_INT_VAR";
85        unsafe {
86            env::remove_var(key);
87        }
88
89        let default = 123i32;
90        let result = env_with_default(key, default);
91        assert_eq!(result, default);
92    }
93
94    #[test]
95    fn test_env_with_default_boolean_exists_true() {
96        let key = "TEST_BOOL_TRUE_VAR";
97        unsafe {
98            env::set_var(key, "true");
99        }
100
101        let result = env_with_default(key, false);
102        assert_eq!(result, true);
103
104        unsafe {
105            env::remove_var(key);
106        }
107    }
108
109    #[test]
110    fn test_env_with_default_boolean_exists_false() {
111        let key = "TEST_BOOL_FALSE_VAR";
112        unsafe {
113            env::set_var(key, "false");
114        }
115
116        let result = env_with_default(key, true);
117        assert_eq!(result, false);
118
119        unsafe {
120            env::remove_var(key);
121        }
122    }
123
124    #[test]
125    fn test_env_with_default_boolean_missing() {
126        let key = "TEST_MISSING_BOOL_VAR";
127        unsafe {
128            env::remove_var(key);
129        }
130
131        let default = true;
132        let result = env_with_default(key, default);
133        assert_eq!(result, default);
134    }
135
136    #[test]
137    fn test_env_with_default_boolean_invalid() {
138        let key = "TEST_INVALID_BOOL_VAR";
139        unsafe {
140            env::set_var(key, "maybe");
141        }
142
143        let result = env_with_default(key, false);
144        assert_eq!(result, false);
145
146        unsafe {
147            env::remove_var(key);
148        }
149    }
150
151    #[test]
152    fn test_env_with_default_u32_exists() {
153        let key = "TEST_U32_VAR";
154        let expected = 42u32;
155        unsafe {
156            env::set_var(key, expected.to_string());
157        }
158
159        let result = env_with_default(key, 0u32);
160        assert_eq!(result, expected);
161
162        unsafe {
163            env::remove_var(key);
164        }
165    }
166
167    #[test]
168    fn test_env_with_default_u32_negative_invalid() {
169        let key = "TEST_U32_NEGATIVE_VAR";
170        unsafe {
171            env::set_var(key, "-42");
172        }
173
174        let result = env_with_default(key, 0u32);
175        assert_eq!(result, 0u32);
176
177        unsafe {
178            env::remove_var(key);
179        }
180    }
181
182    #[test]
183    fn test_env_with_default_empty_string() {
184        let key = "TEST_EMPTY_STRING_VAR";
185        unsafe {
186            env::set_var(key, "");
187        }
188
189        let result = env_with_default(key, "default".to_string());
190        assert_eq!(result, "");
191
192        unsafe {
193            env::remove_var(key);
194        }
195    }
196
197    #[test]
198    fn test_env_with_default_whitespace_string() {
199        let key = "TEST_WHITESPACE_VAR";
200        unsafe {
201            env::set_var(key, "  whitespace  ");
202        }
203
204        let result = env_with_default(key, "default".to_string());
205        assert_eq!(result, "  whitespace  ");
206
207        unsafe {
208            env::remove_var(key);
209        }
210    }
211
212    #[test]
213    fn test_env_with_environment() {
214        let key = "TEST_ENVIRONMENT";
215        unsafe {
216            env::set_var(key, "DEVELOPMENT");
217        }
218
219        let result = env_with_default(key, environment::Environment::Development);
220        assert_eq!(result, environment::Environment::Development);
221
222        unsafe {
223            env::remove_var(key);
224        }
225    }
226
227    #[test]
228    fn test_env_with_mode() {
229        let key = "TEST_MODE";
230        unsafe {
231            env::set_var(key, "STATIC");
232        }
233
234        let result = env_with_default(key, mode::Mode::STATIC);
235        assert_eq!(result, mode::Mode::STATIC);
236
237        unsafe {
238            env::remove_var(key);
239        }
240    }
241}