menva 1.1.0

Manage environment variables
Documentation
use std::net::Ipv4Addr;
use std::str::FromStr;

use menva::FromEnv;

#[test]
fn test_from_env_with_prefix() {
    #[derive(Debug, PartialEq)]
    enum Env {
        Dev,
        Prod,
    }

    impl FromStr for Env {
        type Err = String;

        fn from_str(s: &str) -> Result<Self, Self::Err> {
            match s.to_lowercase().as_str() {
                "dev" => Ok(Env::Dev),
                "prod" => Ok(Env::Prod),
                _ => Err(format!("Invalid value for enum Env: {}", s)),
            }
        }
    }

    #[derive(Debug, FromEnv)]
    struct Config {
        ip: Ipv4Addr,
        env: Env,
    }

    std::env::set_var("IP", "0.0.0.0");
    std::env::set_var("ENV", "Prod");
    std::env::set_var("WEB_IP", "1.1.1.1");
    std::env::set_var("WEB_ENV", "dev");

    let config = Config::from_env_with_prefix("");
    let config2 = Config::from_env_with_prefix("WEB_");

    assert!(config.ip.eq(&Ipv4Addr::new(0, 0, 0, 0)));
    assert!(config.env == Env::Prod);

    assert!(config2.ip.eq(&Ipv4Addr::new(1, 1, 1, 1)));
    assert!(config2.env == Env::Dev);
}

#[test]
fn test_from_env_macro() {
    #[derive(Debug, PartialEq)]
    enum Env {
        Dev,
        Prod,
    }

    impl FromStr for Env {
        type Err = String;

        fn from_str(s: &str) -> Result<Self, Self::Err> {
            match s.to_lowercase().as_str() {
                "dev" => Ok(Env::Dev),
                "prod" => Ok(Env::Prod),
                _ => Err(format!("Invalid value for enum Env: {}", s)),
            }
        }
    }

    #[derive(Debug, FromEnv)]
    struct Config {
        database_url: String,
        #[env_prefix("MYAPP_")]
        api_key: String,
        ip: Ipv4Addr,
        port: u16,
        env: Env,
    }

    std::env::set_var("DATABASE_URL", "postgres://localhost");
    std::env::set_var("MYAPP_API_KEY", "12345");
    std::env::set_var("PORT", "8080");
    std::env::set_var("IP", "0.0.0.0");
    std::env::set_var("ENV", "Prod");

    let config = Config::from_env();

    assert!(config.database_url.eq("postgres://localhost"));
    assert!(config.api_key.eq("12345"));
    assert!(config.ip.eq(&Ipv4Addr::new(0, 0, 0, 0)));
    assert!(config.port.eq(&8080));
    assert!(config.env == Env::Prod);
}