pub fn var(key: &str) -> Option<String> {
std::env::var(key).ok().filter(|s| !s.trim().is_empty())
}
pub fn var_or(key: &str, default: &str) -> String {
var(key).unwrap_or_else(|| default.to_string())
}
pub fn parse_or<T: std::str::FromStr>(key: &str, default: T) -> T {
var(key).and_then(|v| v.parse().ok()).unwrap_or(default)
}
pub fn parse_bool(key: &str, default: bool) -> bool {
match var(key) {
Some(v) => matches!(v.to_ascii_lowercase().as_str(), "1" | "true" | "yes" | "on"),
None => default,
}
}