config-manager 0.4.5

Crate to build config from environment, command line and files
Documentation
use std::collections::HashMap;

use config_manager::config;
use serde::Deserialize;

use crate::{assert_ok_and_compare, set_env, test_env};

const CONFIG_NAME: &str = "name";

#[derive(Debug, PartialEq, Deserialize)]
struct Foo {
    data: Bar,
}

#[derive(Debug, PartialEq, Deserialize)]
enum Bar {
    First(Option<i32>),
    Second,
}

#[derive(Debug, PartialEq)]
#[config(
    clap(version, author),
    env_prefix = "a",
    file(format = "json", env = "config", optional),
    __debug_cmd_input__("-b=165", "--struct={\"data\": {\"First\": 7}}")
)]
struct MethodConfig {
    #[source(clap, env, config)]
    a: i32,
    #[source(
        env(init_from = stringify!(env_b)),
        default = "abc",
        config(init_from = CONFIG_NAME)
    )]
    b: String,
    #[source(config = "bpm", clap(short = 'b'))]
    c: i32,
    #[source(default = HashMap::new())]
    d: HashMap<i32, String>,
    #[source(clap(long = "struct"), default = Foo{ data: Bar::Second })]
    e: Foo,
}

fn input1() {
    set_env("config", "./tests/data/config.json");
    set_env("a_a", 5);

    assert_ok_and_compare(&MethodConfig {
        a: 5,
        b: "Mike".into(),
        c: 165,
        d: HashMap::new(),
        e: Foo {
            data: Bar::First(Some(7)),
        },
    });
}

#[test]
fn big_test() {
    test_env(vec![input1]);
}