1use crate::env::FromString;
2use crate::errcode::{Kind, Origin};
3use crate::{Error, Result};
4use std::env;
5use std::env::VarError;
6
7pub fn get_env<T: FromString>(var_name: &str) -> Result<Option<T>> {
9 match env::var(var_name) {
10 Ok(val) => {
11 match T::from_string(&val) {
12 Ok(v) => Ok(Some(v)),
13 Err(e) => Err(error(format!("The environment variable `{var_name}` cannot be decoded. The value `{val}` is invalid: {e:?}"))),
14 }
15 },
16 Err(e) => match e {
17 VarError::NotPresent => Ok(None),
18 VarError::NotUnicode(_) => Err(error(format!("The environment variable `{var_name}` cannot be decoded because it is not some valid Unicode"))),
19 },
20 }
21}
22
23pub fn get_env_ignore_error<T: FromString>(var_name: &str) -> Option<T> {
25 get_env::<T>(var_name).ok().flatten()
26}
27
28pub fn is_set<T: FromString>(var_name: &str) -> Result<bool> {
30 Ok(get_env::<T>(var_name)?.is_some())
31}
32
33pub fn get_env_with_default<T: FromString>(var_name: &str, default_value: T) -> Result<T> {
35 Ok(get_env::<T>(var_name)?.unwrap_or(default_value))
36}
37
38pub fn get_env_with_default_ignore_error<T: FromString>(var_name: &str, default_value: T) -> T {
40 get_env::<T>(var_name)
41 .ok()
42 .flatten()
43 .unwrap_or(default_value)
44}
45
46pub(crate) fn error(msg: String) -> Error {
47 Error::new(Origin::Core, Kind::Invalid, msg)
48}