2个版本

0.1.1 2021年9月13日
0.1.0 2020年3月25日

#280 in 配置

BSD-3-Clause

275KB
6.5K SLoC

CFG配置格式是一种类似于JSON的文本格式,是JSON的超集。它始于2008年首次宣布之前,具有以下目标

  • 允许具有键值映射和列表支持的分层配置方案。
  • 支持配置文件中不同部分之间的交叉引用。
  • 提供字符串插值功能,以便轻松地从其他配置值构建配置值。
  • 提供组合配置的能力(使用包含和合并功能)。
  • 在平台支持的情况下,提供安全访问真实应用程序对象的能力。
  • 完全声明式。

它克服了JSON作为配置格式时的一些缺点

  • JSON比必要的更冗长。
  • JSON不允许注释。
  • JSON不提供对日期和多行字符串的一等支持。
  • JSON不允许列表和映射中存在尾随逗号。
  • JSON不提供轻松的交叉引用、插值或组合。

一个简单的例子

使用以下配置文件,例如 test0.cfg

a: 'Hello, '
b: 'world!'
c: {
  d: 'e'
}
'f.g': 'h'
christmas_morning: `2019-12-25 08:39:49`
home: `$HOME`
foo: `$FOO|bar`

您可以使用,例如 the evcxr REPL 加载和查询上述配置

$ evcxr
>> :dep cfg-lib
>> use cfg_lib::*;

加载配置

上述配置可以按以下方式加载。在REPL壳中

>> let cfg = Config::from_file("test0.cfg").unwrap();

成功的 from_file() 调用返回一个 Config 实例,可用于查询配置。

使用键访问元素

使用简单键访问配置的元素并不比使用 HashMap 更困难

>> cfg.get("a")
Ok(Base(String("Hello, ")))
>> cfg.get("b")
Ok(Base(String("world!")))

返回的值类型为 Value

使用路径访问元素

除了简单的键,还可以使用路径字符串访问元素。

>> cfg.get("c.d")
Ok(Base(String("e")))

在这里,所需的值通过(在幕后)遍历路径 c.d 在一步中获取 – 首先获取键 c 的映射,然后在结果映射中获取 d 的值。

注意,你可以有看起来像路径的简单键。

>> cfg.get("f.g")
Ok(Base(String("h")))

如果给定的键存在于配置中,则将其用作键,如果它不在配置中,则尝试将其解释为路径。因此,f.g 存在并通过键访问,而 c.d 不是一个现有键,因此解释为路径。

日期/时间对象的访问

您还可以通过在反引号字符串中使用 ISO 日期/时间模式从配置中获取本地 Rust 日期/时间对象。

>> cfg.get("christmas_morning")
Ok(Base(DateTime(2019-12-25T08:39:49+00:00)))

如果您仅指定日期部分,则获取 NaiveDate 对象;如果您还指定了时间组件,则获取 DateTime 对象。如果没有指定偏移量,则假定它为零。

访问环境变量

要访问环境变量,请使用以下形式的反引号字符串:$VARNAME

>> cfg.get("home")
Ok(Base(String("/home/vinay")))

您可以使用 $VARNAME|default-value 形式指定一个默认值,如果环境变量不存在则使用该值。如果 VARNAME 不是一个环境变量中的变量,则返回管道字符后面的任何字符串(包括空字符串)。

>> cfg.get("foo")
Ok(Base(String("bar")))

有关更多信息,请参阅CFG 文档

依赖关系

~3–4.5MB
~76K SLoC