#config-file #macro-derive #applications #autoconf #implemented #traits #settings

已删除 autoconf_core

由 autoconf derive 宏实现的核心特质集合

1 个不稳定版本

0.1.0 2024年4月26日

#6#autoconf


2 crate 使用

MIT 许可证

8KB

自动配置

一个简单的 Rust 应用配置宏。


由 Kidan Nelson 用 ❤️ 构建

概述

autoconf 是一个 crate,它通过自动推导功能以从环境变量、配置文件和默认值中加载设置,从而简化 Rust 应用配置的管理。这是通过程序性地解析结构体字段来构建环境变量键以及使用 serde 从提供的配置文件路径进行反序列化来完成的。功能可以通过几个宏属性助手进行自定义。

属性 功能
prefix 设置环境变量的前缀,可以在结构体或字段级别设置。
path 指定配置文件的路径,可以省略扩展名。
key 覆盖属性的默认键名,忽略前缀和字段名。
nest 对于非标准类型,这些也必须推导出 Config
skip 跳过从环境变量加载属性。
separator 设置放置在前缀和字段名之间的分隔符字符,可以在结构体或字段级别设置,默认为 "_"

主要特性

  • 简单性:最少模板代码,只需注释你的结构体以及具有命名字段和单个方法的结构体。
  • 灵活性:支持从环境变量、单个 tomljsonyamlxmlinironjson5 配置文件中加载配置数据,并以默认特质实现作为后备。
  • 集成:方便地与其他宏(如 smart_default)集成。

用法

以下是一个包含所有当前实现属性的完整示例。首先定义一个配置结构体,由 derive 宏从指定来源填充

use autoconf::prelude::*;
use smart_default::SmartDefault;

#[derive(Config, Clone, SmartDefault)]
#[config(prefix = "PREFIX", path = "tests/config")]
pub struct Test {
    #[config(key = "CUSTOM_KEY")]
    #[default = "World"]
    name: String,
    #[config(prefix = "APP")]
    #[default = 3]
    id: i32,
    #[config(nest)]
    nested: Nested,
    #[config(key = "TIMEOUT_MS")]
    #[default = 1000]
    timeout: u64,
    #[config(key = "FEATURE_ENABLED")]
    #[default = false]
    feature_enabled: bool,
    #[default = 1.5]
    ratio: f64,
    #[config(nest)]
    metadata: Metadata,
    #[config(skip)]
    #[default(Some("Unused".to_string()))]
    unused_field: Option<String>,
}

#[derive(Config, Default, Clone)]
pub struct Nested {
    name: String,
}

#[derive(Config, Default, Clone)]
#[config(prefix = "META", separator = "__")]
pub struct Metadata {
    description: String,
    version: i32,
}

然后你可以像这样加载你的设置

fn main() {
   let settings = Test::config();
}

此设计旨在方便在类似 std::sync::OnceLock 的内容中使用。

考虑因素

  • 版本灵活性:这是一个初始版本(v0.1.0),因此尚未完全优化。为了简单起见,实现过程中涉及一些克隆操作,这可能会影响大规模应用中的性能。
  • 生产使用注意事项:这是我的第一个公开发布的Rust crate,虽然它功能完整且对我很有用,但在关键的生产环境中,如果没有经过彻底测试,尤其是在需要稳定性和性能保证的情况下,建议不要过度依赖这个库。
  • 贡献:欢迎贡献!无论是功能请求、错误报告还是pull request,我都希望得到一些建设性的反馈!

强烈推荐查看 config crate,因为它是一个功能完整的非proc-macro替代品。这个crate实际上依赖于 config 进行文件解析。

无运行时依赖