use std::env; use std::ffi::OsStr; use std::ops::Drop; pub fn set_if_unset(k: K, v: V) -> TmpEnv where K: AsRef, V: AsRef, { match env::var(&k) { Ok(_) => TmpEnv::WasAlreadySet, Err(_) => { env::set_var(&k, v); TmpEnv::WasNotSet { k: k } } } } #[must_use] pub enum TmpEnv where K: AsRef, { WasAlreadySet, WasNotSet { k: K, } } impl Drop for TmpEnv where K: AsRef, { fn drop(&mut self) { if let TmpEnv::WasNotSet { ref k } = *self { env::remove_var(k); } } }