1 个不稳定版本

0.1.0 2023年2月7日

#669配置

Download history 9/week @ 2024-03-07 6/week @ 2024-03-14 15/week @ 2024-03-21 34/week @ 2024-03-28 20/week @ 2024-04-04 9/week @ 2024-04-18 15/week @ 2024-04-25 39/week @ 2024-05-02 30/week @ 2024-05-09 15/week @ 2024-05-16 29/week @ 2024-05-23 32/week @ 2024-05-30 36/week @ 2024-06-06 23/week @ 2024-06-13 25/week @ 2024-06-20

123 每月下载量

MIT/Apache

9KB

DesEnv-rs

环境变量反序列化库。

使用此库,可以将一组环境变量反序列化为更结构化的数据类型。

安装

# Cargo.toml
[dependencies]
desenv = "0.1.0"

使用方法

该库提供了一个实用函数,用于从环境变量中加载配置

fn main() {
    let _config: Config = desenv::load().expect("Failed to load configuration");
}

然后 Config 应该像这样

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    field1: String,
    field2: String,
}

为了成功加载 Config,在环境变量中需要两个变量

  • FIELD1
  • FIELD2

自定义配置

可以自定义配置的加载方式。

重命名

desenv 字段属性上使用 rename 修饰符,可以指示库查找不同的变量。在上面的示例中,在加载配置时,库将尝试查找 FIELD_1 变量。

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    #[desenv(rename = "FIELD_1")]
    field1: String,
}

请注意,重命名属性是区分大小写的。所以在上面的示例中,库将尝试查找一个名为 downcased_field_1 的环境变量。

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    #[desenv(rename = "down_case_field_1")]
    field1: String,
}

默认值

使用此修饰符可以指示库反序列化一个带有默认值的环境变量。

带值

如果 FIELD1 环境变量不存在,库将用 value 填充 field1

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    #[desenv(default = "value")]
    field1: String,
}

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    #[desenv(default(value = "value"))]
    field1: String,
}

带环境变量

如果 FIELD1 环境变量不存在,库将尝试作为后备选项加载 FALLBACK_FIELD1 环境变量。如果 FALLBACK_FIELD1 也不存在,则加载将失败。

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    #[desenv(default(env = "FALLBACK_FIELD1"))]
    field1: String,
}

带标准默认值

如果 FIELD1 环境变量不存在,库将用该类型的 Default 实现填充 field1。例如,对于字符串,默认值将是一个空字符串。

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    #[desenv(default)]
    field1: String,
}

分隔符

指示库如何将字符串反序列化为向量,通过对字符串进行 split 操作。提供的值必须是一个字符。不能用于非向量字段。

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    #[desenv(separator = ';')]
    field1: String,
}

嵌套

通知库不要使用环境变量,而应同时使用 Desenv 宏来反序列化指定的字段。

use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    #[desenv(nested)]
    field1: NestedConfig,
}

#[derive(Desenv)]
pub struct NestedConfig {
    field: String,
}

前缀

如果设置,将为每个反序列化的环境变量应用该前缀。在下面的示例中,field1 将反序列化为 PREFIXED_FIELD1。请注意,前缀是区分大小写的。

use desenv::Desenv;

#[derive(Desenv)]
#[desenv(prefix = "PREFIX_")]
pub struct Config {
    field1: String,
}

如果带前缀的结构体有带前缀的嵌套结构体,则结果将是前缀的连接。在示例中,NestedConfig 中的字段将使用 PARENT_NESTED_FIELD 环境变量来解决。

use desenv::Desenv;

#[derive(Desenv)]
#[desenv(prefix = "PARENT_")]
pub struct Config {
    #[desenv(nested)]
    field1: NestedConfig,
}

#[derive(Desenv)]
#[desenv(prefix = "NESTED_")]
pub struct NestedConfig {
    field: String,
}

OsString

在无法以 utf8 编码环境变量的一些特定情况下,支持 OsString

use std::ffi::OsString;
use desenv::Desenv;

#[derive(Desenv)]
pub struct Config {
    field1: OsString,
}

支持类型

目前,任何混合了 TFromStr 特性的类型都可以用作简单字段。其他支持类型包括

  • Option<T>
  • Vec<T>
  • OsString

依赖项

~1.5MB
~35K SLoC