28 个版本

0.9.2 2024年5月26日
0.9.0 2023年10月25日
0.7.3 2023年7月18日
0.5.0 2023年3月17日
0.1.0 2022年12月25日

#184配置

Download history 216/week @ 2024-05-26 17/week @ 2024-06-02 3/week @ 2024-06-09 1/week @ 2024-06-16 33/week @ 2024-07-21 175/week @ 2024-07-28

每月208 次下载

MIT 许可证

120KB
2K SLoC

config-it

Rust 的异步集中式配置管理

config-it 是一个异步库,为 Rust 应用程序提供集中式配置管理。以下是其关键特性:

  • 使用结构体定义自定义配置模板。
  • 基于单个模板创建具有不同路径的多个实例。
  • 当您的实例更新时接收通知。
  • 使用与 serde 兼容的存档格式以您首选的方式存档您的数据。
  • 管理属性级脏标志,以实现系统精确、响应式的更新。

由于我英语写作能力不强,所以借助 AI 辅助编写了此 README 文件。谢谢,机器人!

用法


lib.rs:

异步集中式配置管理的 crate。

用法

您可以定义 'Template',它定义了一组应一次性更新的属性。只有被 config_it 装饰的属性才会被计算为给定组的一部分,并会被管理。

Template 必须实现 Clone 特性。

您应创建 Storage 来创建配置组实例(Group<T:Template>)。Storage 是集中式配置管理的首要演员。可以根据存储实例实例化配置组。

任何实现 serde::Serializeserde::DeserializeOwned 的属性都可以用作配置属性。

属性

任何带有属性 #[config_it]#[config] 装饰的字段将被视为配置属性。您可以通过在括号内添加额外的属性来指定属性的额外约束。

  • 默认= <>
    • 指定属性的默认值。在将表达式转换为字段类型时使用 .try_into().unwrap() 表达式时,您应该在这里指定不可失败的表达式。这是为了支持从 &strString 或类似的所有权转换的便捷值提升。
  • default_expr= "<expr>"
    • 在此处指定复杂的值表达式。要在此处指定字符串字面量,必须使用反斜杠(\)转义双引号(")。由于此属性直接将给定的表达式转换为令牌树,因此您可以在此处编写任何有效的Rust表达式。
  • rename= "<alias>"
    • 指定属性的别名。当您想在配置文件中使用不同的属性名称,但在代码中想要使用原始名称时,这很有用。
  • one_of= [<>, <>, ...]
    • 指定属性允许的值的集合。当您想将属性的值限制为特定值集合时,这很有用。您还可以将默认值指定为允许的值之一。
    • 默认值可能不在允许的集合中,也可以从允许的集合中排除。在这种情况下,将值设置回默认值将不允许。
  • min = <value>max=<value>
    • 将属性的值限制在给定的范围内。任何实现了 Ord 的类型都可以有最小/最大约束。
  • env = "<env_var>"env_once = "<env_var>"
    • 指定要从其中导入值的环境变量名称。如果未设置环境变量,则将使用默认值。使用 TryParse 特性将环境变量值转换为属性类型。
    • env_once 只在创建后懒加载一次并重用缓存的值。
  • no_import
    • 不要从导入的存档中更新值。当与 env 标志混用时,即使存档已导入,其值也将保持为导入的环境变量。
  • no_export
    • 不要将值导出到存档。
  • transient
    • 值不会被存档,也不会从存档中导入。
  • hidden
    • 向监控系统提示,此属性不应可见。
  • no_notify

非默认值

存储模板可能包含多个非配置字段。由于 Template 宏不需要实现 Default 特性,如果非配置类型没有提供类型级别的默认实现,它将报告错误。

#[derive(config_it::Template, Clone)]
struct Config {
    #[config(default = 154)]
    pub any_number: i32,

    // This is just okay.
    pub non_config_with_default: usize,

    pub non_config_number: std::num::NonZeroUsize,
 // ^^^ the trait `Default` is not implemented for `NonZeroUsize`
}

在这种情况下,您可以通过 non_config_default_expr 属性为字段指定非默认值。此属性接受字符串字面量,它将被解析为Rust表达式。

#[derive(config_it::Template, Clone)]
struct Config {
    #[config(default = 154)]
    pub any_number: i32,

    #[non_config_default_expr = r#"1.try_into().unwrap()"#]
    pub non_config_number: std::num::NonZeroUsize,
}

依赖关系

~2–11MB
~111K SLoC