#![allow(dead_code)]
use doc_writer::DocumentationWriter;
use env_config::EnvConfig;
use std::error::Error;
use std::str::FromStr;
use std::{env, io};
#[derive(EnvConfig)]
#[env(prefix = "SERVER_")]
pub struct Config {
#[env(rename = "timeout")]
timeout_millis: u32,
#[env(no_prefix)]
verbosity_level: Verbosity,
#[env(skip, flatten)] address: Address,
#[env(skip)]
process_id: u64,
}
#[derive(EnvConfig)]
pub struct Address {
domain: String,
#[env(default = 80)]
port: u16,
}
#[derive(EnvConfig, Debug, Eq, PartialEq)]
#[env(rename_all = "lowercase")]
pub enum Verbosity {
Info,
#[env(default)]
Warning,
#[env(rename = "Error")]
Panic,
#[env(skip)]
Silent,
}
fn main() -> Result<(), Box<dyn Error>> {
let cfg = Config::from_env(env::vars())?;
let cfg = Config::from_env(vec!["SERVER_TIMEOUT", "3000"])?;
assert_eq!(3000, cfg.timeout_millis);
let mut doc = doc_writer::render::MarkdownWriter::new(io::stdout());
doc.start_environment()?;
Config::default().document_env(&mut doc)?;
doc.start_enum("Verbosity")?;
Verbosity::document_enum(&mut doc)?;
assert_eq!(80, Address::default().port);
assert_eq!(Verbosity::Warning, Verbosity::default());
assert_eq!(Verbosity::Panic, Verbosity::from_str("ErRoR")?);
assert_eq!(
r#"expected one of "info", "warning", "error", got "silent""#,
&format!("{}", Verbosity::from_str("silent").unwrap_err())
);
assert_eq!(
r#"expected one of "info", "warning", "error", got "panic""#,
&format!("{}", Verbosity::from_str("panic").unwrap_err())
);
Ok(())
}