5个版本
0.2.1 | 2020年8月3日 |
---|---|
0.2.0 | 2020年8月3日 |
0.1.2 | 2020年8月2日 |
0.1.1 | 2020年8月2日 |
0.1.0 | 2020年8月2日 |
#515 in 配置
30KB
627 行
manaconf
用于创建分层配置提供者的库
此库让您能够从多个来源读取配置,并通过键从这些来源拉取值。
受dotnetcore配置系统启发。(尽管这并不像那样深入)
// create our config to read configuration values from environment variables
// with the prefix MYAPP
let config = Builder::new()
.with_source(sources::EnvVarSource::with_prefix("MYAPP"))
.build();
// Read our config data in
let config_data: ConfigData = config.bind()?;
struct ConfigData {
important_value: String,
optional_value: Option<i32>
}
impl TryFromValueRead for ConfigData {
fn try_from<R>(read: &R) -> Result<Self, TryFromValueReadError> {
// As our config is set to read from the environment varibles only
// the EnvVarSource will turn this key into `MYAPP_IMPORTANT` due
// to the prefix set above and the key being requested here
let important_value: String = read.get_expected_value("important")?;
// and this one will be turned into `MYAPP_OPTIONAL`
let optional_value: Option<i32> = read.get_value("optional")?;
ConfigData {
important_value,
optional_value
}
}
}
键
键以字符串形式表示的层次结构,例如 section::subsection::value
,可用于深入到可能具有任意深度值组织的配置中。
不同的来源可能以不同的方式解释这个层次结构。例如,EnvVarSource
将将其转换为一个大写字符串,其中分隔符被下划线替换。(SECTION_SUBSECTION_VALUE
)。
但是,JSON来源可能会使用这种方式来深入到子对象中。
部分
您可以在 Config
和 Section
类型上调用 section
方法来创建一个 section
。因为部分只是您键的预应用前缀。
当某些代码不知道或不应该知道父层次结构时很有用。
例如,如果我们拿上面的类型,但实际上我们的值 important
和 optional
实际上并不位于根目录,而是位于 some::subsection
,我们可以使用 Section
来给那段代码提供访问值的权限,就像 Section
的前缀是根一样。
let section = config.section("some::subsection");
let config_data: ConfigData = section.bind();
// Even though ConfigData only asks for `important` and `optional` due to the
// `Section`, the actual keys being looked up is `some::subsection::important` and
// `some::subsection::optional`.
多个来源
您可以在构建 Config
时通过调用 Builder::add_source
或 Builder::add_source_with_prefix
来配置多个来源。
您添加来源的顺序是来源的优先级。第一个来源的优先级最高。
在查找值时,manaconf 将按顺序检查每个来源,并返回遇到的第一个值或错误。如果没有来源返回任何值,则返回 None
。
这允许您配置来源,使一个来源可以覆盖另一个来源。
待办事项
-
更多来源
目前只有
EnvVarSource
用于从环境变量中获取值,以及CommandLineSource
用于从简化的命令行参数方案中获取值。但是,我想提供更多功能。例如,支持 toml/json/yml 文件、.env 文件等。
然而,我认为将其他源作为crate实现会更好。
-
派生宏
如果可以将
TryFromValueRead
实现为一个派生宏,那将会很棒,尽管我还没有研究如何实现这一点。 -
异步支持
可能有必要为从源中读取提供异步支持。
-
???
我们将看看使用过程中还会出现什么其他功能。