injection 0.1.1

A lightweight dependency injection container for Rust applications
Documentation
use clap::Parser;
use config::Config;
use std::ops::Deref;

/// 全局配置包装器
/// 用于管理和访问应用程序的全局配置
pub struct GlobalConfig {
    /// 内部配置对象
    config: Config,
}

impl GlobalConfig {
    /// 创建新的全局配置实例
    /// 会自动加载配置文件(默认为 application.toml)
    pub fn new() -> GlobalConfig {
        GlobalConfig {
            config: init_config(),
        }
    }
}

/// 实现 Deref trait,使得 GlobalConfig 可以像 Config 一样使用
impl Deref for GlobalConfig {
    type Target = Config;

    fn deref(&self) -> &Self::Target {
        &self.config
    }
}

/// 命令行参数结构体
/// 仅在启用 "clap" 特性时可用
#[cfg(feature = "clap")]
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Args {
    /// 配置文件路径(不包含扩展名,默认为 application)
    #[arg(short, long, default_value = "application")]
    pub config: String,
}

/// 初始化配置(带命令行参数支持)
/// 仅在启用 "clap" 特性时可用
/// 会解析命令行参数获取配置文件路径,如果指定的配置文件不存在则回退到默认的 application.toml
#[cfg(feature = "clap")]
pub fn init_config() -> Config {
    let args = Args::parse();
    Config::builder()
        .add_source(config::File::with_name(&args.config))
        .build()
        .unwrap_or_else(|_| {
            // 如果指定的配置文件不存在,尝试使用默认的 application 配置
            Config::builder()
                .add_source(config::File::with_name("application"))
                .build()
                .expect("无法初始化配置 - 请确保 application.toml 文件存在")
        })
}

/// 初始化配置(不带命令行参数支持)
/// 在未启用 "clap" 特性时使用
/// 默认加载 application.toml 配置文件
#[cfg(not(feature = "clap"))]
pub fn init_config() -> Config {
    Config::builder()
        .add_source(config::File::with_name("application"))
        .build()
        .expect("无法初始化配置 - 请确俚 application.toml 文件存在")
}