use std::str::FromStr;
pub fn env_or_default<T: FromStr>(key: &str, default: T) -> T {
std::env::var(key)
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(default)
}
pub fn is_env_truthy(env: &str) -> bool {
match std::env::var(env) {
Ok(var) => matches!(var.to_lowercase().as_str(), "1" | "true"),
_ => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_env_or_default() {
std::env::set_var("TEST_ENV", "42");
assert_eq!(env_or_default("TEST_ENV", 0), 42);
std::env::remove_var("TEST_ENV");
assert_eq!(env_or_default("TEST_ENV", 0), 0);
std::env::set_var("TEST_ENV", "42");
assert!(!env_or_default("TEST_ENV", false));
}
#[test]
fn test_is_env_truthy() {
let cases = [
("1", true),
("true", true),
("0", false),
("false", false),
("", false),
("cthulhu", false),
];
for (input, expected) in cases.iter() {
std::env::set_var("TEST_ENV", input);
assert_eq!(is_env_truthy("TEST_ENV"), *expected);
}
}
}