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