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 815 : pub fn var<V, E>(varname: &str) -> Option<V>
8 815 : where
9 815 : V: FromStr<Err = E>,
10 815 : E: Display,
11 815 : {
12 815 : 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 0 : ),
20 815 : 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 65 : pub fn var_serde_json_string<V>(varname: &str) -> Option<V>
29 65 : where
30 65 : V: serde::de::DeserializeOwned,
31 65 : {
32 65 : match std::env::var(varname) {
33 65 : Ok(s) => Some({
34 65 : let value = serde_json::Value::String(s);
35 65 : serde_json::from_value(value)
36 65 : .map_err(|e| {
37 0 : format!("failed to parse env var {varname} as a serde_json json string: {e:#}")
38 65 : })
39 65 : .unwrap()
40 65 : }),
41 0 : 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 : }
|