figment2 0.11.5

Remaintained fork of figment: A configuration library so con-free, it's unreal.
Documentation
#![cfg(all(feature = "test", feature = "yaml"))]
use figment2::{Figment, providers::Env};

#[derive(serde::Deserialize)]
struct Config {
    foo: Vec<u32>,
    bar: BarStruct,
    int_value: u32,
}

#[derive(serde::Deserialize, PartialEq, Debug)]
struct BarStruct {
    x: u32,
}

#[test]
fn custom_env_parser() {
    figment2::Jail::expect_with(|jail| {
        jail.set_env("FOO", "[1, 2, 3]");
        jail.set_env("BAR", "{\"x\": 123}");
        jail.set_env("INT_VALUE", "0");

        let config = Figment::new()
            .merge(Env::raw().parser(|v| {
                serde_json::from_str(v).unwrap_or_else(|_| figment2::value::Value::from(v))
            }))
            .extract::<Config>()?;

        assert_eq!(config.foo, vec![1, 2, 3]);
        assert_eq!(config.bar, BarStruct { x: 123 });
        assert_eq!(config.int_value, 0);

        jail.set_env("FOO", "[\n1 # One\n, 2 # Two\n, 3, # Three\n]");
        jail.set_env("BAR", "x: 321");
        jail.set_env("INT_VALUE", "987");

        let config = Figment::new()
            .merge(Env::raw().parser(|v| {
                serde_norway::from_str(v).unwrap_or_else(|_| figment2::value::Value::from(v))
            }))
            .extract::<Config>()?;

        assert_eq!(config.foo, vec![1, 2, 3]);
        assert_eq!(config.bar, BarStruct { x: 321 });
        assert_eq!(config.int_value, 987);

        Ok(())
    });
}