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, test_env};

fn simple_field() {
    #[derive(Debug, PartialEq)]
    #[config(__debug_cmd_input__("--plain=1", "--long=2", "--specified-long=3", "-u=4", "-q=5"))]
    struct Simple {
        #[source(clap)]
        plain: i32,
        #[source(clap)]
        long: i32,
        #[source(clap(long = "specified-long"))]
        long2: i32,
        #[source(clap(short))]
        unspecified_short: i32,
        #[source(clap(short = 'q'))]
        short2: i32,
    }

    assert_ok_and_compare(&Simple {
        plain: 1,
        long: 2,
        long2: 3,
        unspecified_short: 4,
        short2: 5,
    })
}

fn complex_field() {
    #[derive(Debug, PartialEq, Deserialize)]
    enum Foo {
        Simple,
        Struct(Person),
        Map(HashMap<i32, bool>),
    }

    #[derive(Debug, PartialEq, Deserialize)]
    struct Person {
        name: String,
        last_name: Option<String>,
        age: Option<i32>,
    }

    #[derive(Debug, PartialEq)]
    #[config(__debug_cmd_input__(
        "--field=[
            \"Simple\",
            {\"Struct\": {
                \"name\": \"Mike\",
                \"last_name\": null,
                \"age\": 22
            }},
            {\"Map\": {
                1: false,
                2: false,
                42: true
            }}
        ]"
    ))]
    struct Complex {
        #[source(clap)]
        field: Vec<Foo>,
    }

    assert_ok_and_compare(&Complex {
        field: vec![
            Foo::Simple,
            Foo::Struct(Person {
                name: "Mike".into(),
                last_name: None,
                age: Some(22),
            }),
            Foo::Map(HashMap::from_iter([(1, false), (2, false), (42, true)])),
        ],
    })
}

fn flags() {
    #[derive(Debug, PartialEq)]
    #[config(__debug_cmd_input__("--flag_setted", "-e=false"))]
    struct Flags {
        #[source(clap(flag))]
        flag_setted: bool,
        #[source(clap(flag), default = false)]
        flag_unsetted: bool,
        #[source(clap(short, flag), default = true)]
        explicit_flag: bool,
    }

    assert_ok_and_compare(&Flags {
        flag_setted: true,
        flag_unsetted: false,
        explicit_flag: false,
    })
}

#[test]
fn clap() {
    test_env(vec![simple_field, complex_field, flags]);
}