envsync/
lib.rs

1use envie::Envie;
2use std::env;
3
4pub struct EnvSync {
5    envie: Envie,
6}
7
8impl EnvSync {
9    /// The newly created 'EnvSync' instance loads the '.env' file and manages environmental variables in memory.
10    pub fn new() -> Result<Self, String> {
11        let envie = Envie::load()?;
12        Ok(Self { envie })
13    }
14
15    /// Load environment variables from the '.env' file and synchronize them with your system environment.
16    pub fn reload(&mut self) -> Result<(), String> {
17        self.envie.reload()?;
18        self.sync_with_system()?;
19        Ok(())
20    }
21
22    /// Synchronizes the system environment variable with the environment variable in memory.
23    fn sync_with_system(&self) -> Result<(), String> {
24        self.envie.export_to_system_env()
25    }
26
27    /// Gets values from system environment variables.
28    pub fn get_system_env(&self, key: &str) -> Option<String> {
29        env::var(key).ok()
30    }
31
32    /// Gets the value from within memory.
33    pub fn get_mem_env(&self, key: &str) -> Option<String> {
34        self.envie.get(key)
35    }
36
37    /// Sets values for both memory and system environment variables.
38    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    /// Remove values from system environment variables and also from the '.env' file.
45    pub fn remove(&mut self, key: &str) -> Result<(), String> {
46        self.envie.remove(key)?;
47        env::remove_var(key);
48        Ok(())
49    }
50
51    /// Export all in-memory environment variables to system environment variables.
52    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}