#configuration #environment #settings #source #env-var #proc-macro

已删除 autoconf

一个简单而强大的 derive 宏,用于从各种来源加载配置结构体

1 个不稳定版本

0.1.0 2024年4月26日

#84#env-var

MIT 许可证

19KB
63 代码行

Autoconf

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


由 Kidan Nelson 用 ❤️ 构建

概述

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

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

主要特性

  • 简单性:极少的样板代码,只需注解您的结构体以及一个具有命名字段和单个方法的结构体即可。
  • 灵活性:支持从环境变量、单个 tomljsonyamlxmlinironjson5 配置文件中加载配置数据,默认 trait 实现作为后备。
  • 集成:方便与其他宏集成,如 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,虽然它完全功能并且对我很有用,但在没有经过彻底测试的情况下,不建议在生产环境中过度依赖这个库,尤其是在需要稳定性和性能保证的情况下。
  • 贡献:欢迎贡献!无论是功能请求、错误报告还是拉取请求,我都欢迎一些建设性的反馈!

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

依赖关系

~2–2.9MB
~61K SLoC