use std::{io, env};
use winreg::enums::*;
use winreg::RegKey;
pub fn set_var(var: &str, value: &str) -> io::Result<()> {
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let key = hkcu.open_subkey_with_flags("Environment", KEY_SET_VALUE)?;
key.set_value(var, &value)?;
env::set_var(var, value);
Ok(())
}
pub fn unset_var(var: &str) -> io::Result<()> {
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let key = hkcu.open_subkey_with_flags("Environment", KEY_SET_VALUE)?;
key.delete_value(var)?;
env::remove_var(var);
Ok(())
}
#[cfg(test)]
mod tests {
use winreg::enums::*;
use winreg::RegKey;
use std::env;
#[test]
fn is_set_globally() {
crate::set_var("ENVTEST", "TESTVALUE").unwrap();
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let key = hkcu
.open_subkey_with_flags("Environment", KEY_READ)
.unwrap();
let var: String = key.get_value("ENVTEST").unwrap();
assert_eq!(String::from("TESTVALUE"), var);
}
#[test]
fn is_set_locally() {
assert_eq!(String::from("TESTVALUE"), env::var("ENVTEST").unwrap());
}
#[test]
#[should_panic]
fn is_unset_globally() {
crate::unset_var("ENVTEST").unwrap();
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let key = hkcu
.open_subkey_with_flags("Environment", KEY_READ)
.unwrap();
let _: String = key.get_value("ENVTEST").unwrap();
}
#[test]
#[should_panic]
fn is_unset_locally() {
env::var("ENVTEST").unwrap();
}
}