1use crate::EnvError;
2use log::warn;
3use std::env;
4use std::time::Duration;
5
6pub fn get_env_duration_seconds_required(env_name: &str) -> Result<Duration, EnvError> {
9 get_env_duration_seconds_internal(env_name)
10 .and_then(|maybe| match maybe {
11 None => {
12 warn!("Env var '{}' not supplied.", env_name);
13 Err(EnvError::RequiredNotPresent)
14 },
15 Some(val) => Ok(val),
16 })
17}
18
19pub fn get_env_duration_seconds_optional(env_name: &str) -> Option<Duration> {
22 match get_env_duration_seconds_internal(env_name) {
23 Err(e) => {
24 warn!("Env var '{}': error parsing numeric value: `{:?}`. Returning no value.", env_name, e);
25 None
26 },
27 Ok(None) => {
28 warn!("Env var '{}' not present.", env_name);
29 None
30 },
31 Ok(Some(value)) => Some(value),
32 }
33}
34
35pub fn get_env_duration_seconds_or_default(env_name: &str, default: Duration) -> Duration {
38 get_env_duration_seconds_internal(env_name)
39 .map(|maybe| match maybe {
40 None => {
41 warn!("Env var '{}' not supplied. Using default '{:?}'.", env_name, default);
42 default
43 },
44 Some(val) => val,
45 })
46 .unwrap_or_else(|e| {
47 warn!("Env var '{}': error parsing numeric value: {:?}. Using default '{:?}'.",
48 env_name, e, default);
49 default
50 })
51}
52
53fn get_env_duration_seconds_internal(env_name: &str) -> Result<Option<Duration>, EnvError> {
54 match env::var(env_name).as_ref().ok() {
55 None => {
56 Ok(None)
57 },
58 Some(val) => match val.parse::<u64>() {
59 Ok(number) => Ok(Some(Duration::from_secs(number))),
60 Err(_) => Err(EnvError::ParseError { reason: format!("Couldn't parse as number: '{}'", val) })
61 }
62 }
63}