Line data Source code
1 : //! Wrapper around `std::env::var` for parsing environment variables.
2 :
3 : use std::fmt::Display;
4 : use std::str::FromStr;
5 :
6 : /// For types `V` that implement [`FromStr`].
7 215 : pub fn var<V, E>(varname: &str) -> Option<V>
8 215 : where
9 215 : V: FromStr<Err = E>,
10 215 : E: Display,
11 : {
12 215 : match std::env::var(varname) {
13 0 : Ok(s) => Some(
14 0 : s.parse()
15 0 : .map_err(|e| {
16 0 : format!("failed to parse env var {varname} using FromStr::parse: {e:#}")
17 0 : })
18 0 : .unwrap(),
19 : ),
20 215 : Err(std::env::VarError::NotPresent) => None,
21 : Err(std::env::VarError::NotUnicode(_)) => {
22 0 : panic!("env var {varname} is not unicode")
23 : }
24 : }
25 3 : }
26 :
27 : /// For types `V` that implement [`serde::de::DeserializeOwned`].
28 17 : pub fn var_serde_json_string<V>(varname: &str) -> Option<V>
29 17 : where
30 17 : V: serde::de::DeserializeOwned,
31 : {
32 17 : match std::env::var(varname) {
33 0 : Ok(s) => Some({
34 0 : let value = serde_json::Value::String(s);
35 0 : serde_json::from_value(value)
36 0 : .map_err(|e| {
37 0 : format!("failed to parse env var {varname} as a serde_json json string: {e:#}")
38 0 : })
39 0 : .unwrap()
40 : }),
41 17 : Err(std::env::VarError::NotPresent) => None,
42 : Err(std::env::VarError::NotUnicode(_)) => {
43 0 : panic!("env var {varname} is not unicode")
44 : }
45 : }
46 0 : }
|