Skip to main content

env_var/
lib.rs

1//! module for accessing environment variables through macros.
2#![warn(missing_docs)]
3
4/// env_var macro
5/// 
6/// ## Examples
7///
8/// ```ignore
9/// #[macro_use]
10/// extern crate env_var;
11///
12/// fn main() {
13///   // retrieving a optional value
14///   // var1 either contains the value or an empty string
15///   let var1 = env_var!(optional "TEST_OPT_1");
16///
17///   // retrieving a optional value with default
18///   // var1 either contains the value or "default1"
19///   let var1 = env_var!(optional "TEST_OPT_1", default: "default1");
20///
21///   // retrieving a optional value with default
22///   // if not found, the message will be logged as info message
23///   // var1 either contains the value or "default1"
24///   let var1 = env_var!(optional "TEST_OPT_1", default: "default1", msg: "using default");
25///
26///   // retrieving a required value
27///   // var1 either contains the value or the programm panics
28///   let var1 = env_var!(required "TEST_OPT_1");
29///
30///   // retrieving a required value with default
31///   // var1 either contains the value or "default1"
32///   let var1 = env_var!(required "TEST_OPT_1", default: "default1");
33///
34///   // retrieving a required value with default
35///   // if not found, the message will be logged as warn message
36///   // var1 either contains the value or "default1"
37///   let var1 = env_var!(required "TEST_OPT_1", default: "default1", msg: "using default");
38/// }
39/// ```
40#[macro_export]
41macro_rules! env_var {
42  //require variables
43  {required $key:expr} => {
44    match std::env::var($key) {
45      Ok(val) => val,
46      Err(_err) =>{
47        log::error!("missing environment variable: {}",$key);
48        panic!("missing environment variable");
49      },
50    }
51  };
52  {required $key:expr, default: $default:expr} => {
53    match std::env::var($key) {
54      Ok(val) => val,
55      Err(_err) => $default.to_string(),
56    }
57  };
58  {required $key:expr, msg: $msg:expr} => {
59    match std::env::var($key) {
60      Ok(val) => val,
61      Err(_err) =>{
62        log::error!("{}",$msg);
63        panic!("missing environment variable");
64      },
65    }
66  };
67  {required $key:expr, default: $default:expr, msg: $msg:expr} => {
68    match std::env::var($key) {
69      Ok(val) => val,
70      Err(_err) =>{
71        log::warn!("{}",$msg);
72        $default.to_string()
73      },
74    }
75  };
76
77  //optional variables
78  {optional $key:expr} => {
79    match std::env::var($key) {
80      Ok(val) => val.to_string(),
81      Err(_err) => "".to_string(),
82    }
83  };
84  {optional $key:expr, default: $default:expr} => {
85    match std::env::var($key) {
86      Ok(val) => val.to_string(),
87      Err(_err) => {
88        $default.to_string()
89      },
90    }
91  };
92  {optional $key:expr, msg: $msg:expr} => {
93    match std::env::var($key) {
94      Ok(val) => val.to_string(),
95      Err(_err) => {
96        log::warn!("{}",$msg);
97        "".to_string()
98      },
99    }
100  };
101  {optional $key:expr, default: $default:expr, msg: $msg:expr} => {
102    match std::env::var($key) {
103      Ok(val) => val.to_string(),
104      Err(_err) => {
105        log::info!("{}",$msg);
106        $default.to_string()
107      },
108    }
109  };
110  {optional $key:expr, msg: $msg:expr, default: $default:expr} => {
111    match std::env::var($key) {
112      Ok(val) => val.to_string(),
113      Err(_err) => {
114        log::info!("{}",$msg);
115        $default.to_string()
116      },
117    }
118  };
119}
120
121#[cfg(test)]
122mod tests {
123  #[test]
124  fn get_optional_found() {
125    std::env::set_var("TEST_OPT_1", "VAL");
126    let result: String = env_var!(optional "TEST_OPT_1");
127    assert_eq!(result,"VAL");
128  }
129  #[test]
130  fn get_optional_notfound() {
131    let result: String = env_var!(optional "TEST_OPT_2");
132    assert_eq!(result,"");
133  }
134  #[test]
135  fn get_optional_msg_found() {
136    std::env::set_var("TEST_OPT_3", "VAL");
137    let result: String = env_var!(optional "TEST_OPT_3", msg: "var not found");
138    assert_eq!(result,"VAL");
139  }
140  #[test]
141  fn get_optional_msg_notfound() {
142    std::env::set_var("TEST_OPT_4", "VAL");
143    let result: String = env_var!(optional "TEST_OPT_4", msg: "var not found");
144    assert_eq!(result,"VAL");
145  }
146  #[test]
147  fn get_optional_default_found() {
148    std::env::set_var("TEST_OPT_5", "VAL");
149    let result: String = env_var!(optional "TEST_OPT_5", default: "whatever");
150    assert_eq!(result,"VAL");
151  }
152  #[test]
153  fn get_optional_default_notfound() {
154    let result: String = env_var!(optional "TEST_OPT_6", default: "whatever");
155    assert_eq!(result,"whatever");
156  }
157  #[test]
158  fn get_optional_default_msg_found() {
159    std::env::set_var("TEST_OPT_7", "VAL");
160    let result: String = env_var!(optional "TEST_OPT_7", default: "whatever", msg: "using default value");
161    assert_eq!(result,"VAL");
162  }
163  #[test]
164  fn get_optional_default_msg_notfound() {
165    let result: String = env_var!(optional "TEST_OPT_8", default: "whatever", msg: "using default value");
166    assert_eq!(result,"whatever");
167  }
168  #[test]
169  fn get_optional_msg_default_found() {
170    std::env::set_var("TEST_OPT_9", "VAL");
171    let result: String = env_var!(optional "TEST_OPT_9", msg: "using default value", default: "whatever");
172    assert_eq!(result,"VAL");
173  }
174  #[test]
175  fn get_optional_msg_default_notfound() {
176    let result: String = env_var!(optional "TEST_OPT_10", default: "whatever", msg: "using default value");
177    assert_eq!(result,"whatever");
178  }
179  #[test]
180  #[should_panic]
181  fn get_required_notfound() {
182    let _result: String = env_var!(required "NON_EXISTANT_VARIABLE");
183  }
184  #[test]
185  fn get_required_found() {
186    std::env::set_var("TEST_REQ_1", "VAL");
187    let result: String = env_var!(required "TEST_REQ_1");
188    assert_eq!(result,"VAL");
189  }
190  #[test]
191  fn get_required_or_default_found() {
192    std::env::set_var("TEST_REQ_2", "VAL");
193    let result: String = env_var!(required "TEST_REQ_2", default: "WHATEVER");
194    assert_eq!(result,"VAL");
195  }
196  #[test]
197  fn get_required_or_default_notfound() {
198    let result: String = env_var!(required "TEST_REQ_3", default: "WHATEVER");
199    assert_eq!(result,"WHATEVER");
200  }
201
202  #[test]
203  fn get_required_msg_found() {
204    std::env::set_var("TEST_REQ_4", "VAL");
205    let result: String = env_var!(required "TEST_REQ_4", default: "value not found");
206    assert_eq!(result,"VAL");
207  }
208  #[test]
209  #[should_panic]
210  fn get_required_msg_notfound() {
211    let _result: String = env_var!(required "TEST_REQ_5", msg: "value not found");
212  }
213}