server_env_config/lib.rs
1//! Util types and functions to quickly and easy set up an HTTP server from environment variables.
2//!
3//! See [`Config::init()`] for examples.
4
5mod conf;
6pub mod db;
7pub mod env;
8pub mod server;
9
10use anyhow::{anyhow, Context, Result};
11use std::env::var;
12use std::fmt::Debug;
13use std::str::FromStr;
14
15pub use self::conf::Config;
16
17/// Read boolean environment variable, accepting "0" or "false" as false
18/// values, and "1" or "true" values as true.
19/// # Examples
20/// ```
21/// use std::env;
22/// use server_env_config::env_bool;
23///
24/// // Right values
25/// env::set_var("BOOL_ENV", "true");
26/// assert!(matches!(env_bool("BOOL_ENV", false), Ok(true)));
27/// env::set_var("BOOL_ENV", "0");
28/// assert!(matches!(env_bool("BOOL_ENV", true), Ok(false)));
29///
30/// // No value set
31/// assert!(matches!(env_bool("NOT_SET_ENV", true), Ok(true)));
32///
33/// // Wrong value
34/// env::set_var("BOOL_ENV", "not a boolean");
35/// assert!(env_bool("BOOL_ENV", false).is_err());
36/// ```
37pub fn env_bool(env_name: &'static str, default_value: bool) -> Result<bool> {
38 var(env_name)
39 .map(|v| match v.as_str() {
40 "0" => "false".to_owned(),
41 "1" => "true".to_owned(),
42 _ => v.to_lowercase(),
43 })
44 .map(|v| {
45 v.parse::<bool>()
46 .with_context(|| format!("{env_name} invalid boolean \"{v}\""))
47 })
48 .unwrap_or(Ok(default_value))
49}
50
51/// Get a parsable value from an env value like a number,
52/// otherwise return `default_value`.
53/// # Examples
54/// ```
55/// use std::env;
56/// use server_env_config::env_parsable;
57///
58/// // Right values
59/// env::set_var("NUM_ENV", "1234");
60/// assert!(matches!(env_parsable::<u16>("NUM_ENV", 1), Ok(1234)));
61///
62/// // No value set
63/// assert!(matches!(env_parsable::<u32>("ENV_NOT_SET", 1), Ok(1)));
64///
65/// // Wrong value
66/// env::set_var("LONG_ENV", "not a number");
67/// assert!(env_parsable::<i64>("LONG_ENV", 1).is_err());
68/// ```
69pub fn env_parsable<A: FromStr>(env_name: &'static str, default_value: A) -> Result<A>
70where
71 <A as FromStr>::Err: Debug,
72{
73 var(env_name)
74 .map(|v| {
75 v.parse::<A>()
76 .map_err(|_| anyhow!("{env_name} invalid number \"{v}\""))
77 })
78 .unwrap_or(Ok(default_value))
79}