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