forest/utils/misc/
env.rs

1// Copyright 2019-2025 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use std::str::FromStr;
5
6/// Get the value of an environment variable, or a default value if it is not set or cannot be
7/// parsed.
8pub 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
15/// Check if the given environment variable is set to truthy value.
16/// Returns false if not set.
17pub fn is_env_truthy(env: &str) -> bool {
18    is_env_set_and_truthy(env).unwrap_or_default()
19}
20
21/// Check if the given environment variable is set to truthy value.
22/// Returns None if not set.
23pub 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            // variable set, should return its parsed value
37            std::env::set_var("TEST_ENV", "42");
38            assert_eq!(env_or_default("TEST_ENV", 0), 42);
39
40            // variable not set, should return default
41            std::env::remove_var("TEST_ENV");
42            assert_eq!(env_or_default("TEST_ENV", 0), 0);
43
44            // unparsable value given the default type, should return default
45            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}