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 配置

MIT 协议

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来源可能会使用这种方式来深入到子对象中。

部分

您可以在 ConfigSection 类型上调用 section 方法来创建一个 section。因为部分只是您键的预应用前缀。

当某些代码不知道或不应该知道父层次结构时很有用。

例如,如果我们拿上面的类型,但实际上我们的值 importantoptional 实际上并不位于根目录,而是位于 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_sourceBuilder::add_source_with_prefix 来配置多个来源。

您添加来源的顺序是来源的优先级。第一个来源的优先级最高。

在查找值时,manaconf 将按顺序检查每个来源,并返回遇到的第一个值或错误。如果没有来源返回任何值,则返回 None

这允许您配置来源,使一个来源可以覆盖另一个来源。

待办事项

  • 更多来源

    目前只有 EnvVarSource 用于从环境变量中获取值,以及 CommandLineSource 用于从简化的命令行参数方案中获取值。

    但是,我想提供更多功能。例如,支持 toml/json/yml 文件、.env 文件等。

    然而,我认为将其他源作为crate实现会更好。

  • 派生宏

    如果可以将 TryFromValueRead 实现为一个派生宏,那将会很棒,尽管我还没有研究如何实现这一点。

  • 异步支持

    可能有必要为从源中读取提供异步支持。

  • ???

    我们将看看使用过程中还会出现什么其他功能。

无运行时依赖