confgr 0.2.1

A simple rust application configuration derive macro.
Documentation
use confgr::prelude::*;

use std::fs;
use std::io::Write;

mod common;

#[derive(Config, Debug)]
#[config(prefix = "PRIORITY")]
pub struct TestPriority {
    pub name: String,
    pub id: i32,
}

impl Default for TestPriority {
    fn default() -> Self {
        Self {
            name: "DefaultName".to_string(),
            id: 1,
        }
    }
}

#[derive(Config, Debug)]
#[config(path = "tests/common/priority.toml", prefix = "PRIORITY")]
pub struct TestFilePriority {
    pub name: String,
    #[config(skip)]
    pub skipped: bool,
    pub timeout: u64,
}

impl Default for TestFilePriority {
    fn default() -> Self {
        Self {
            name: "DefaultName".to_string(),
            skipped: false,
            timeout: 100,
        }
    }
}

fn setup_env_vars() {
    std::env::set_var("PRIORITY_NAME", "EnvName");
    std::env::set_var("PRIORITY_ID", "20");
    std::env::set_var("PRIORITY_TIMEOUT", "500");
    std::env::set_var("PRIORITY_SKIPPED", "false");
}

fn cleanup_env_vars() {
    std::env::remove_var("PRIORITY_NAME");
    std::env::remove_var("PRIORITY_ID");
    std::env::remove_var("PRIORITY_TIMEOUT");
    std::env::remove_var("PRIORITY_SKIPPED");
}

fn create_config_file() {
    let data = r#"
            name = "TomlName"
            timeout = 400
            skipped = true
        "#;
    let mut file = fs::File::create("tests/common/priority.toml").unwrap();
    writeln!(file, "{}", data).unwrap();
}

fn cleanup_config_file() {
    let _ = fs::remove_file("tests/common/priority.toml");
}

#[test]
fn test_env_overrides_config_and_default() {
    setup_env_vars();
    create_config_file();

    let config = TestFilePriority::load_config();

    assert_eq!(config.name, "EnvName");
    assert_eq!(config.timeout, 500);

    cleanup_env_vars();
    cleanup_config_file();
}

#[test]
fn test_file_overrides_default() {
    cleanup_env_vars();
    create_config_file();

    let config = TestFilePriority::load_config();

    assert_eq!(config.name, "TomlName");
    assert_eq!(config.timeout, 400);

    cleanup_config_file();
}

#[test]
fn test_default_without_config() {
    cleanup_env_vars();
    cleanup_config_file();

    let config = TestPriority::load_config();

    assert_eq!(config.name, "DefaultName");
    assert_eq!(config.id, 1);
}

#[test]
fn test_skip_env_with_file() {
    setup_env_vars();
    create_config_file();

    let config = TestFilePriority::load_config();
    assert!(config.skipped);

    cleanup_env_vars();
    cleanup_config_file();
}