1use std::str::FromStr;
5
6pub fn env_or_default<T: FromStr>(key: &str, default: T) -> T {
9 std::env::var(key)
10 .ok()
11 .and_then(|v| v.parse().ok())
12 .unwrap_or(default)
13}
14
15pub fn is_env_truthy(env: &str) -> bool {
18 is_env_set_and_truthy(env).unwrap_or_default()
19}
20
21pub fn is_env_set_and_truthy(env: &str) -> Option<bool> {
24 std::env::var(env)
25 .ok()
26 .map(|var| matches!(var.to_lowercase().as_str(), "1" | "true" | "yes" | "_yes_"))
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32
33 #[test]
34 fn test_env_or_default() {
35 unsafe {
36 std::env::set_var("TEST_ENV", "42");
38 assert_eq!(env_or_default("TEST_ENV", 0), 42);
39
40 std::env::remove_var("TEST_ENV");
42 assert_eq!(env_or_default("TEST_ENV", 0), 0);
43
44 std::env::set_var("TEST_ENV", "42");
46 assert!(!env_or_default("TEST_ENV", false));
47 }
48 }
49
50 #[test]
51 fn test_is_env_truthy() {
52 let cases = [
53 ("1", true),
54 ("true", true),
55 ("0", false),
56 ("false", false),
57 ("", false),
58 ("cthulhu", false),
59 ];
60
61 for (input, expected) in cases.iter() {
62 unsafe { std::env::set_var("TEST_ENV", input) };
63 assert_eq!(is_env_truthy("TEST_ENV"), *expected);
64 }
65 }
66}