cfg-rs 1.0.4

A rust configuration loader
Documentation
use cfg_rs::*;

#[allow(dead_code)]
#[derive(Debug, FromConfig)]
#[config(prefix = "app")]
struct AppCfg {
    #[validate(range(min = 1, max = 65535))]
    port: u16,
    #[validate(length(min = 1, max = 64))]
    host: String,
    #[validate(regex = "^[a-z0-9_]+$")]
    user: String,
    #[validate(regex = "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$")]
    email: String,
    #[validate(custom = check_threads)]
    threads: usize,
}

fn check_threads(v: &usize) -> Result<(), String> {
    if *v == 0 {
        return Err("threads must be > 0".to_string());
    }
    Ok(())
}

fn main() -> Result<(), ConfigError> {
    let cfg = Configuration::new()
        .register_kv("inline")
        .set("app.port", "8080")
        .set("app.host", "localhost")
        .set("app.user", "user_1")
        .set("app.email", "user@example.com")
        .set("app.threads", "2")
        .finish()?;

    let app: AppCfg = cfg.get_predefined()?;
    println!("{:?}", app);
    Ok(())
}