#env-var #proc-macro #enums #macro-derive #extract #extracting #traits

env-extract

将环境变量提取到字符串或枚举中

5个版本

0.1.22 2023年6月14日
0.1.21 2023年6月13日
0.1.2 2023年6月13日
0.1.1 2023年6月11日
0.1.0 2023年6月11日

#1051过程宏

每月下载 21
用于 create-ruxt-app

MIT 许可证

30KB
330 代码行

env-extract

“env-extract”crate提供了将环境变量提取到不同数据类型的便捷方法。

该crate包含两个过程宏:ConfigStructEnvVar,可以用来推导特性和自动从环境变量中提取值。

用法

要使用EnvVarConfigStruct宏,请在您的Cargo.toml文件中将env-extract作为依赖项添加

[dependencies]
env-extract = "0.1.22"

然后,在您的Rust代码中,通过添加以下行导入过程宏

use env_extract::{EnvVar, ConfigStruct};

ConfigStruct宏

ConfigStruct宏应用于结构体,并推导出ConfigStruct特证。此特证允许通过按名称从环境变量中提取每个字段来轻松检索结构体。结构体的字段有效类型如下

  • String
  • bool
  • u8, u16, u32, u64, u128
  • i8, i16, i32, i64, i128
  • f32, f64
  • 从枚举中推导出EnvVar

ConfigStruct宏支持结构体字段上的以下属性

  • default:为字段设置默认值。如果没有提供,当环境变量未设置时,宏将引发panic。
  • env_var:设置用于此字段的环境变量名称。如果未提供,则宏将使用字段的名称大写作为环境变量名称。
  • enumerated:标识实现了EnvVar特质的枚举。宏将解析环境变量到枚举类型。

EnvVar 宏

EnvVar宏应用于枚举并实现了EnvVar特质,该特质提供了一个.get()方法,用于从环境变量中检索类型为T的值。宏将环境变量解析到枚举类型。

EnvVar宏要求枚举满足以下条件之一:

  • 一个名为“Invalid”的变体,如果环境变量不匹配任何变体,则返回。
  • 一个标记为#[default]的变体,如果环境变量不匹配任何变体,则返回。
  • 要标记为#[panic_on_invalid]的枚举,如果环境变量不匹配任何变体,则会导致panic。

EnvVar宏允许在枚举本身上设置以下属性:

  • #[env_var = "FOO"]:设置要搜索的自定义环境变量名称。默认为枚举名称的大写。
  • #[panic_on_invalid]:如果没有找到有效的变体,则引发panic。
  • #[case(convert = "[uppercase|lowercase|exact|any]")]:在将有效变体映射之前,将所有环境变量值转换为特定的大小写。如果变体也包含此属性,则覆盖此属性。

EnvVar宏还支持枚举变体上的以下属性:

  • #[case = "[uppercase|lowercase|exact|any]"]:指定被注释枚举变体的案例转换。选项uppercaselowercase在将环境变量值与变体名称比较之前将其转换为大写或小写。选项exact在比较时不进行大小写转换。选项any在比较之前将环境变量值和变体名称都转换为小写。
  • #[default]:指定默认枚举变体。
  • #[ignore_variant]:在检查匹配时忽略被注释的枚举变体。

示例用法

use env_extract::{ConfigStruct, EnvVar};

#[derive(Debug, EnvVar)]
#[var_name = "DATABASE_TYPE"]
#[panic_on_invalid]
#[case(convert = "lowercase")]
enum DatabaseType {
    Postgres,
    Mysql,
    Sqlite,
}

#[derive(ConfigStruct, Debug)]
struct Config {
    db_host: String,
    db_port: u16,
    use_tls: bool,

    #[enumerated]
    db_type: DatabaseType,
}

fn main() {
    std::env::set_var("DB_HOST", "localhost");
    std::env::set_var("DB_PORT", "5432");
    std::env::set_var("USE_TLS", "true");
    std::env::set_var("DATABASE_TYPE", "postgres");

    let config = Config::get();

    assert_eq!(config.db_host, "localhost");
    assert_eq!(config.db_port, 5432);
    assert_eq!(config.use_tls, true);
    assert!(matches!(config.db_type, DatabaseType::Postgres));
}

在上面的示例中,使用宏 ConfigStruct 为结构体 Config 衍生 ConfigStruct trait,从而能够轻松地从环境变量中检索值。使用宏 EnvVar 为枚举类型 DatabaseType 衍生 EnvVar trait,允许从“DATABASE_TYPE”环境变量中提取枚举变体。环境变量值将根据指定的转换规则进行解析和转换。最后,结构体 Config 使用从环境变量中检索的值进行填充,并使用断言来验证提取的值。

依赖项

~1.5MB
~34K SLoC