pub trait Environment: Send + Sync {
fn get_var(&self, name: &str) -> Option<String>;
fn set_var(&self, name: &str, value: &str);
fn remove_var(&self, name: &str);
}
#[cfg(feature = "native")]
pub struct NativeEnvironment;
#[cfg(feature = "native")]
impl Environment for NativeEnvironment {
fn get_var(&self, name: &str) -> Option<String> {
std::env::var(name).ok()
}
fn set_var(&self, name: &str, value: &str) {
unsafe {
std::env::set_var(name, value);
}
}
fn remove_var(&self, name: &str) {
unsafe {
std::env::remove_var(name);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_var_existing() {
let env = NativeEnvironment;
assert!(env.get_var("PATH").is_some());
}
#[test]
fn test_get_var_missing() {
let env = NativeEnvironment;
assert!(env.get_var("CLAWFT_DEFINITELY_NOT_SET_12345").is_none());
}
#[test]
fn test_set_and_get_var() {
let env = NativeEnvironment;
let key = "CLAWFT_TEST_SET_GET_VAR";
env.set_var(key, "test_value");
assert_eq!(env.get_var(key), Some("test_value".to_string()));
env.remove_var(key);
}
#[test]
fn test_remove_var() {
let env = NativeEnvironment;
let key = "CLAWFT_TEST_REMOVE_VAR";
env.set_var(key, "to_remove");
assert!(env.get_var(key).is_some());
env.remove_var(key);
assert!(env.get_var(key).is_none());
}
#[test]
fn test_set_var_overwrites() {
let env = NativeEnvironment;
let key = "CLAWFT_TEST_OVERWRITE_VAR";
env.set_var(key, "first");
assert_eq!(env.get_var(key), Some("first".to_string()));
env.set_var(key, "second");
assert_eq!(env.get_var(key), Some("second".to_string()));
env.remove_var(key);
}
}