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 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}