#config-file #macro-derive #attributes #applications #field #prefix #autoconf

已删除 autoconf_derive

autoconf crate 的过程推导宏实现

1 个不稳定版本

0.1.0 2024年4月26日

#7 in #autoconf


autoconf 中使用

MIT 许可证

32KB
457

Autoconf

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


由 Kidan Nelson 用 ❤️ 构建

概述

autoconf 是一个 crate,通过自动推导功能,使 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包,虽然它完全功能性和对我很有用,但在没有彻底测试的情况下,特别是在需要稳定性和性能保证的情况下,不建议在生产环境中过度依赖这个库。
  • 贡献:欢迎贡献!无论是功能请求、错误报告还是pull请求,我都欢迎建设性的反馈!

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

依赖

~2–2.9MB
~61K SLoC