1#![warn(missing_docs)]
3
4#[macro_export]
41macro_rules! env_var {
42 {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 $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}