2 个版本

0.1.1 2022 年 5 月 31 日
0.1.0 2022 年 5 月 31 日

#2920Rust 模式

MIT 许可证

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