1pub trait Environment: Send + Sync {
14 fn get_var(&self, name: &str) -> Option<String>;
16
17 fn set_var(&self, name: &str, value: &str);
19
20 fn remove_var(&self, name: &str);
22}
23
24#[cfg(feature = "native")]
26pub struct NativeEnvironment;
27
28#[cfg(feature = "native")]
29impl Environment for NativeEnvironment {
30 fn get_var(&self, name: &str) -> Option<String> {
31 std::env::var(name).ok()
32 }
33
34 fn set_var(&self, name: &str, value: &str) {
35 unsafe {
39 std::env::set_var(name, value);
40 }
41 }
42
43 fn remove_var(&self, name: &str) {
44 unsafe {
46 std::env::remove_var(name);
47 }
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
59 fn test_get_var_existing() {
60 let env = NativeEnvironment;
61 assert!(env.get_var("PATH").is_some());
63 }
64
65 #[test]
66 fn test_get_var_missing() {
67 let env = NativeEnvironment;
68 assert!(env.get_var("CLAWFT_DEFINITELY_NOT_SET_12345").is_none());
69 }
70
71 #[test]
72 fn test_set_and_get_var() {
73 let env = NativeEnvironment;
74 let key = "CLAWFT_TEST_SET_GET_VAR";
75
76 env.set_var(key, "test_value");
77 assert_eq!(env.get_var(key), Some("test_value".to_string()));
78
79 env.remove_var(key);
81 }
82
83 #[test]
84 fn test_remove_var() {
85 let env = NativeEnvironment;
86 let key = "CLAWFT_TEST_REMOVE_VAR";
87
88 env.set_var(key, "to_remove");
89 assert!(env.get_var(key).is_some());
90
91 env.remove_var(key);
92 assert!(env.get_var(key).is_none());
93 }
94
95 #[test]
96 fn test_set_var_overwrites() {
97 let env = NativeEnvironment;
98 let key = "CLAWFT_TEST_OVERWRITE_VAR";
99
100 env.set_var(key, "first");
101 assert_eq!(env.get_var(key), Some("first".to_string()));
102
103 env.set_var(key, "second");
104 assert_eq!(env.get_var(key), Some("second".to_string()));
105
106 env.remove_var(key);
108 }
109}