easyenv/
duration.rs

1use crate::EnvError;
2use log::warn;
3use std::env;
4use std::time::Duration;
5
6/// Get an environment variable as a `Duration` in seconds.
7/// If not provided or cannot parse, return an error.
8pub 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
19/// Get an environment variable as a `Duration` in seconds.
20/// If not present or there is an error in parsing, return `None`.
21pub 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
35/// Get an environment variable as a `Duration` in seconds, or fall back to the provided default.
36/// Returns the default in the event of a parse error.
37pub 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}