1use envie::Envie;
2use std::env;
3
4pub struct EnvSync {
5 envie: Envie,
6}
7
8impl EnvSync {
9 pub fn new() -> Result<Self, String> {
11 let envie = Envie::load()?;
12 Ok(Self { envie })
13 }
14
15 pub fn reload(&mut self) -> Result<(), String> {
17 self.envie.reload()?;
18 self.sync_with_system()?;
19 Ok(())
20 }
21
22 fn sync_with_system(&self) -> Result<(), String> {
24 self.envie.export_to_system_env()
25 }
26
27 pub fn get_system_env(&self, key: &str) -> Option<String> {
29 env::var(key).ok()
30 }
31
32 pub fn get_mem_env(&self, key: &str) -> Option<String> {
34 self.envie.get(key)
35 }
36
37 pub fn set(&mut self, key: &str, value: &str) -> Result<(), String> {
39 self.envie.set(key, value)?;
40 env::set_var(key, value);
41 Ok(())
42 }
43
44 pub fn remove(&mut self, key: &str) -> Result<(), String> {
46 self.envie.remove(key)?;
47 env::remove_var(key);
48 Ok(())
49 }
50
51 pub fn export_all_to_system(&self) -> Result<(), String> {
53 self.envie.export_to_system_env()
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test_reload() {
63 let mut env_sync = EnvSync::new().unwrap();
64 env_sync.set("TEST_KEY", "test_value").unwrap();
65 assert_eq!(env_sync.get_mem_env("TEST_KEY"), Some("test_value".to_string()));
66 env_sync.reload().unwrap();
67 assert_eq!(env_sync.get_system_env("TEST_KEY"), Some("test_value".to_string()));
68 }
69
70 #[test]
71 fn test_set_and_get() {
72 let mut env_sync = EnvSync::new().unwrap();
73 env_sync.set("NEW_KEY", "new_value").unwrap();
74 assert_eq!(env_sync.get_mem_env("NEW_KEY"), Some("new_value".to_string()));
75 assert_eq!(env_sync.get_system_env("NEW_KEY"), Some("new_value".to_string()));
76 }
77
78 #[test]
79 fn test_remove() {
80 let mut env_sync = EnvSync::new().unwrap();
81 env_sync.set("REMOVE_KEY", "remove_value").unwrap();
82 env_sync.remove("REMOVE_KEY").unwrap();
83 assert_eq!(env_sync.get_mem_env("REMOVE_KEY"), None);
84 assert_eq!(env_sync.get_system_env("REMOVE_KEY"), None);
85 }
86
87 #[test]
88 fn test_export_all_to_system() {
89 let env_sync = EnvSync::new().unwrap();
90 env_sync.export_all_to_system().unwrap();
91 assert_eq!(env::var("EXAMPLE_KEY").is_ok(), true);
92 }
93}