use std::env;
pub(crate) fn with_var<F, R>(key: &str, value: Option<&str>, f: F) -> R
where
F: FnOnce() -> R,
{
let previous = env::var(key).ok();
match value {
Some(v) => env::set_var(key, v),
None => env::remove_var(key),
}
let result = f();
match previous {
Some(prev) => env::set_var(key, prev),
None => env::remove_var(key),
}
result
}
#[cfg(test)]
mod tests {
use std::env;
use super::with_var;
#[test]
fn test_with_var_sets_value_inside_and_restores_absent_after() {
let key = "MAGI_TEST_WITH_VAR_ABSENT";
env::remove_var(key);
let inside = with_var(key, Some("hello"), || env::var(key).ok());
assert_eq!(inside.as_deref(), Some("hello"));
assert!(env::var(key).is_err());
}
#[test]
fn test_with_var_none_removes_var_and_restores_prior_value() {
let key = "MAGI_TEST_WITH_VAR_PRESENT";
env::set_var(key, "original");
let inside = with_var(key, None, || env::var(key).ok());
assert_eq!(inside, None); assert_eq!(env::var(key).as_deref(), Ok("original")); env::remove_var(key);
}
}