2 个版本
0.1.1 | 2022 年 5 月 31 日 |
---|---|
0.1.0 | 2022 年 5 月 31 日 |
#2920 在 Rust 模式
10KB
83 行
envload
一个用于根据当前环境自动填充结构体的 derive 宏。
示例
#[derive(Envload)]
struct Env {
secret_key: String,
int_data: i32, // Any type that implements `FromStr` can be used
optional_data: Option<usize>,
}
// Setup environment variables...
env::set_var("SECRET_KEY", "hunter2");
env::set_var("INT_DATA", "128");
env::remove_var("OPTIONAL_DATA");
// ... Struct can now be loaded from current environment.
// Any missing non-`Option` field results in a panic.
// Field names are converted to SCREAMING_SNAKE_CASE, i.e. `secret_key` will load the `SECRET_KEY` env var.
let env = <Env as LoadEnv>::load_env();
assert_eq!(env, Env {
secret_key: String::from("hunter2"),
int_data: 128,
optional_data: None
});
// Add data for `optional_data` field...
env::set_var("OPTIONAL_DATA", "37");
// ... And it's now available!
let env = <Env as LoadEnv>::load_env();
assert_eq!(env.optional_data, Some(37));
动机
在几乎所有我依赖环境变量的代码库中,我最终都会编写一个 Env
结构体,其字段根据当前环境进行填充。
通常,我必须定义一个强制变量列表,然后我必须自己转换数据。
我认为鉴于 Rust 宏的强大功能,它非常适合作为第一个 proc 宏!
结合 dotenv
,这使得环境变量管理相对简单!
未来功能
- 基于
Result
的 API(无 panic) - 字段级选项(指定名称而不默认为 SCREAMING_SNAKE_CASE)
- 功能:通过
lazy_static
或类似方式缓存环境结构体
依赖关系
~340–790KB
~18K SLoC