7个版本
0.2.1 | 2022年7月14日 |
---|---|
0.2.0 | 2022年6月17日 |
0.1.4 | 2022年6月15日 |
0.1.2 | 2021年1月6日 |
0.1.0 | 2019年6月20日 |
#261 在 配置
2,396 每月下载量
用于 north-config
22KB
157 行
econf
一次性将环境变量加载到您的结构体中。
econf
允许轻松地用环境变量覆盖结构体字段。这对于构建可以可选地使用环境变量覆盖某些配置的应用程序很有用。以下是基本用法
use econf::LoadEnv;
#[derive(Debug, LoadEnv)]
struct A {
x: bool,
y: u64,
}
fn main() {
let a = A {
x: true,
y: 42,
};
println!("Before: {:?}", a);
let a = econf::load(a, "PREFIX");
println!("After: {:?}", a);
}
$ ./app
Before: A { x: true, y: 42 }
After: A { x: true, y: 42 }
$ PREFIX_X=false ./app
Before: A { x: true, y: 42 }
After: A { x: false, y: 42 }
在此示例中,
PREFIX_X
被加载到x
PREFIX_Y
被加载到y
环境变量全部为大写,以 _
分隔。
为什么选择 econf?
有一些现有的库提供类似的功能,但 econf
在以下方面具有独特之处
- 支持嵌套:以直观的方式支持嵌套结构体,约束条件很少。
- 支持容器:支持
Vec
、HashMap
和各种类型。 - 补充:在不更改原始逻辑的情况下,将值加载到现有的代码变量中。
- 对贡献者友好:代码库简单。通过学习基本宏的使用,可以轻松理解。
支持类型
- 布尔型:
bool
- 整数:
isize
、usize
、i8
、i16
、i32
、i64
、i128
、u8
、u16
、u32
、u64
、u128
- 字符串:
char
、String
- 浮点数:
f32
、f64
- 网络:
IpAddr
、Ipv4Addr
、Ipv6Addr
、SocketAddr
、SocketAddrV4
、SocketAddrV6
- 非零类型:
NonZeroI128
、NonZeroI16
、NonZeroI32
、NonZeroI64
、NonZeroI8
、NonZeroIsize
、NonZeroU128
、NonZeroU16
、NonZeroU32
、NonZeroU64
、NonZeroU8
、NonZeroUsize
- 文件系统:
PathBuf
- 容器:
Vec
、HashSet
、HashMap
、Option
、BTreeMap
、BTreeSet
、BinaryHeap
、LinkedList
、VecDeque
、tuple
- 容器以 YAML 格式解析。请参阅测试。
嵌套
支持嵌套结构体。
#[derive(LoadEnv)]
struct A {
v1: usize,
v2: B,
}
#[derive(LoadEnv)]
struct B {
v1: usize,
v2: usize,
}
fn main() {
let a = A {
v1: 1,
v2: B {
v1: 2,
v2: 3,
},
};
let a = econf::load(a, "PREFIX");
}
在此示例中,
PREFIX_V1
被加载到a.v1
PREFIX_V2_V1
被加载到a.v2.v1
PREFIX_V2_V2
被加载到a.v2.v2
可以通过将字段名用 _
作为分隔符连接起来来指定嵌套结构体中的字段。然而,存在名称冲突的情况。例如,
#[derive(LoadEnv)]
struct A {
v2_v1: usize,
v2: B,
}
#[derive(LoadEnv)]
struct B {
v1: usize,
v2: usize,
}
fn main() {
let a = A {
v2_v1: 1,
v2: B {
v1: 2,
v2: 3,
},
};
let a = econf::load(a, "PREFIX");
}
在这里 PREFIX_V2_V1
对应于 a.v2_v1
和 a.v2.v1
。在这种情况下,econf
会通过 log facade
打印警告,并将值加载到 a.v2_v1
和 a.v2.v1
。
跳过字段
可以通过添加 #[econf(skip)]
辅助属性来跳过未实现 LoadEnv 或不应由 econf 加载的字段
#[derive(LoadEnv)]
struct A {
x: bool,
#[econf(skip)]
y: u64, // will not be loaded by econf
}
重命名字段
加载具有给定名称的字段,而不是其 Rust 字段名称。如果环境变量名称和 Rust 字段名称不匹配,这很有用
#[derive(LoadEnv)]
struct A {
x: bool,
#[econf(rename = "ANOTHER_Y")]
y: u64, // will be loaded from an environment variable `ANOTHER_Y`
}
许可证:MIT
依赖关系
~7.5MB
~148K SLoC