2 个不稳定版本
0.2.1 | 2022 年 9 月 25 日 |
---|---|
0.1.1 | 2021 年 7 月 18 日 |
#41 in #microservices
22KB
325 行代码(不含注释)
biodome
更轻松地访问环境变量
biodome 做了两件事
- 自动将 env 变量转换为 "正确的" 类型。
- 自动从 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
。其中一些值(不区分大小写)为 true
、t
、yes
、y
、on
、active
、enabled
、1
、ok
等等。
结构化类型
如果 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"]'
在上面的例子中,LOGLEVELS
和 TIMEOUTS
格式化为 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