#env-var #env #parser #microservices #default #environment #structured

biodome

读取和解析带有默认值和结构化类型的 env 变量

2 个不稳定版本

0.2.1 2022 年 9 月 25 日
0.1.1 2021 年 7 月 18 日

#41 in #microservices

自定义许可证

22KB
325 行代码(不含注释)

Crates.io GitHub branch checks state Coveralls Crates.io downloads GitHub

biodome

更轻松地访问环境变量

biodome 做了两件事

  1. 自动将 env 变量转换为 "正确的" 类型。
  2. 自动从 env 变量解析结构化类型。

这个crate是几年前我为Python制作的类似库的Rust实现。我主要用它来处理微服务,现在我也开始在Rust中构建微服务。

演示

此代码读取名为 TIMEOUT 的环境变量

use biodome::biodome;

let TIMEOUT = biodome("TIMEOUT", 10);
let PORTS = biodome("PORTS", vec![8081, 8082, 8083]);

考虑 TIMEOUT 标识符

  • 如果 env 变量未设置,则使用默认值 10,即分配给 TIMEOUT
  • 如果 env 变量已设置,它将自动转换为正确的类型,然后分配。
  • TIMEOUT 标识符的类型始终与默认值类型相同。

考虑 PORTS 标识符

  • 默认值是一个 Vec<i32>:这意味着 PORTS 的类型始终是 Vec<i32>
  • biodome 将解析已设置的 env 变量,使其发生。以下bash环境变量示例将有效:export PORTS=[81, 82]

简单类型

在上面的示例中,字面整数值 10 默认为 i32 类型。对于大多数原始类型,这可以通过明显的方式进行控制

use biodome::biodome;

let TIMEOUT = biodome("TIMEOUT", 10u8);
let TIMEOUT = biodome("TIMEOUT", 10f64);

在上面的示例的第一行中,TIMEOUT 将是一个 u8,任何 env 变量值都必须相应设置,否则将发生运行时错误。同样,如果默认值是 f64,则 TIMEOUT 将是一个 f64

布尔值在解析时的处理方式略有不同

use biodome::biodome;

/// This line sets an environment variable, same as
/// if you have done `export DEBUG=yes` in Bash.
std::env::set_var("DEBUG", "yes");

/// This line reads the value of the env var in Rust.
/// Because the default value is a bool, it means that
/// biodome will attempt to convert the value of the
/// env var into a bool.
let DEBUG = biodome("DEBUG", false);

assert_eq!(DEBUG, true);

如果环境变量被设置为一组“可能为真”的模式,则结果将是 true;否则,false。其中一些值(不区分大小写)为 truetyesyonactiveenabled1ok 等等。

结构化类型

如果 biodome 只做的是将原始类型转换为类型,那么这将是微不足道的。我们还有对更多结构化类型的支持。为了支持这一点,我们使用 TOML 标记格式的一个有限子集来解析所有结构化类型。

假设以下 3 个环境变量被设置

export LOGLEVELS='{ root = "warn", http = "info" }'
export TIMEOUTS='{ connect = 5.0, request = 10.0 }'
export PROXIES='["a.proxy.com:8000", "b.proxy.com:8001"]'

在上面的例子中,LOGLEVELSTIMEOUTS 格式化为 TOML 内联表,而 PROXIES 格式化为 TOML 数组

可以通过 biodome 如下访问它们

use biodome::biodome;
use std::collections::HashMap;
use std::iter::FromIterator;

/// Create the default values for the structured types
let default_loglevels = HashMap::from_iter(
    vec![(String::from("root"), String::from("info"))]
);

let default_timeouts = HashMap::from_iter(
    vec![
        (String::from("resolve"), 1.0),
        (String::from("connect"), 1.0),
        (String::from("request"), 1.0),
    ]
);

let default_proxies = vec![
    "dev.proxy.com:9009".to_string(),
];

/// Read the env vars
let LOGLEVELS = biodome("LOGLEVELS", default_loglevels);
let TIMEOUTS = biodome("TIMEOUTS", default_timeouts);
let PROXIES = biodome("TIMEOUTS", default_proxies);

在上面的示例中,LOGLEVELS 将是一个 HashMap<String, String>TIMEOUTS 将是一个 HashMap<String, f64>,而 PROXIES 将是一个 Vec<String>

其他项目

envy 利用 Serde derive 的功能在填充“设置”结构体时施展魔法。

开发者信息

此 README 由 cargo-readme 生成。请按照其说明进行设置。可以使用 cargo readme > README.md 重新生成 README 文件。

依赖项

~235–480KB
~11K SLoC