env_searcher/
lib.rs

1/// simply contains a string detailing what happened.
2#[derive(Debug, Clone)]
3pub struct EnvSearcherError {
4    pub reason: String,
5}
6use std::fmt;
7impl fmt::Display for EnvSearcherError {
8    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9        write!(f, "{}", self.reason)
10    }
11}
12
13use std::env;
14
15/// gets a environmental variable with the key string.
16/// if the variable is not found, returns an EnvSearcherError
17/// checks for actual environmental variables, then if none is found, goes to find a ".env" file
18/// 
19/// example:
20/// the .env file:
21/// ```env
22///     # this is a comment. This is the .env file
23///     MY_VERY_COOL_KEY_VALUE=wow
24/// ```
25/// the program:
26/// ```no_run
27/// use env_searcher::get_env;
28/// let value = get_env("MY_VERY_COOL_KEY_VALUE");
29/// assert_eq!(value.unwrap(), "wow");
30/// ```
31pub fn get_var(key: String) -> Result<String, EnvSearcherError> {
32    let real_env_var_res = env::var(&key);
33    if real_env_var_res.is_ok() {
34        return Ok(real_env_var_res.ok().unwrap());
35    }
36    let dotenv_res = dotenv::var(key);
37    if dotenv_res.is_ok() {
38        return Ok(dotenv_res.unwrap());
39    }
40    Err(EnvSearcherError{reason: "No such env var".to_string()})
41}
42
43#[cfg(test)]
44mod tests {
45    #[test]
46    fn string_test() {
47        let result = crate::get_var("GOOD_TEST_STRING".to_string());
48        assert_eq!(result.unwrap(), "hello_world");
49    }
50    #[test]
51    fn number_test() {
52        let result = crate::get_var("GOOD_TEST_NUMBER".to_string());
53        assert_eq!(result.unwrap(), "12345");
54    }
55}