use std::path::PathBuf;
use crate::error::Fallible;
#[cfg(unix)]
pub use unix::{get, set};
#[cfg(windows)]
pub use windows::{get, set};
pub fn get_path_like_env(name: &str) -> Fallible<Vec<PathBuf>> {
let paths = get(name)?;
Ok(std::env::split_paths(&paths).collect())
}
#[cfg(windows)]
mod windows {
use once_cell::sync::Lazy;
use std::ffi::OsString;
use std::path::Path;
use winreg::enums::HKEY_CURRENT_USER;
use winreg::RegKey;
use crate::error::Fallible;
static HKCU: Lazy<RegKey> = Lazy::new(|| RegKey::predef(HKEY_CURRENT_USER));
pub fn get(key: &str) -> Fallible<OsString> {
let path = Path::new("Environment");
let env = HKCU.open_subkey(path)?;
Ok(env.get_value(key)?)
}
pub fn set(key: &str, value: Option<&OsString>) -> Fallible<()> {
let path = Path::new("Environment");
let (env, _) = HKCU.create_subkey(path)?;
match value {
Some(value) => env.set_value(key, value)?,
None => {
let _ = env.delete_value(key);
}
}
Ok(())
}
}
#[cfg(unix)]
mod unix {
use std::ffi::OsString;
use crate::error::Fallible;
pub fn get(key: &str) -> Fallible<OsString> {
Ok(std::env::var_os(key).unwrap_or_default())
}
pub fn set(key: &str, value: Option<&OsString>) -> Fallible<()> {
Ok(())
}
}