63 个重大版本发布

0.133.0 2024 年 3 月 19 日
0.129.0 2022 年 7 月 18 日
0.111.0 2022 年 3 月 11 日
0.95.0 2021 年 12 月 25 日
0.45.0 2021 年 7 月 7 日

#226解析器实现

Download history 24/week @ 2024-03-30 3/week @ 2024-04-06 2/week @ 2024-05-18 4/week @ 2024-05-25 1/week @ 2024-06-08

2,035 每月下载量
用于 watchlog

Apache-2.0LGPL-2.0-or-later

57KB
1.5K SLoC

Simple Config

文档

一种为人类设计的非自描述配置语言。

Simple Config 不特定于 Rust 或 serde,但已知的唯一实现同时使用这两者。

为什么使用 Simple Config?

Simple config 基于这样的概念:您不需要能够从配置文件中形成模式。这已经非常常见,但形式更为随意,例如,您可能使用 JSON 字符串来存储日期,如 "1990-02-14"。Simple Config 利用这一点提供更丰富的类型和更少的转义。例如,多行字符串不需要额外的标记,模式表明它是字符串,因此不会尝试将其解析为字典。同样,您不会遇到类型错误,因为 falseno 被解析为布尔值,您也不必担心带数字开头的字符串的引号。

为什么不使用 Simple Config?

  • 没有模式不能解析。(注意:可以跳过未知项,但不能进行语义解析。)
  • 不支持代码重用。Simple Config 适用于相对简单的配置文件,其中不需要重用。
  • 目前不支持序列化。

示例

这是一个小型示例,展示了模式(作为 Rust 代码)和配置(作为字符串字面量)。有关完整说明,请参阅下文。

#[derive(Debug,PartialEq,serde::Deserialize)]
enum Country {
	CA,
	US,
	NO,
}

#[derive(Debug,PartialEq,serde::Deserialize)]
#[serde(rename_all="kebab-case")]
enum Contact {
	Email(String),
	Matrix(String),
	Phone{
		number: u64,
		#[serde(default)]
		extension: Option<u64>,
	},
}

#[derive(Debug,PartialEq,serde::Deserialize)]
#[serde(rename_all="kebab-case")]
struct Contestant {
	contact: Vec<Contact>,
	country: Country,

	#[serde(with = "humantime_serde")]
	personal_best: std::time::Duration,

	#[serde(with = "humantime_serde")]
	last_seen: std::time::SystemTime,
}

let t: std::collections::BTreeMap<String, Contestant> = simple_config::from_bytes("

kevincox:
	contact:
		:
			email: [email protected]

		:
			phone:
				number: 18005551234
	country: CA
	personal-best: 1h 13min
	last-seen: 2021-06-08 00:00:00Z
sarah:
	contact:
		:
			matrix: @me:matrix.example
	country: NO
	personal-best: 73min
	last-seen: 2019-06-30 07:24:30Z

").unwrap();

assert_eq!(t, std::array::IntoIter::new([
	("kevincox".to_owned(), Contestant {
		contact: vec![
			Contact::Email("[email protected]".into()),
			Contact::Phone{number: 18005551234, extension: None},
		],
		country: Country::CA,
		personal_best: std::time::Duration::from_secs(1*3600 + 13*60),
		last_seen: std::time::UNIX_EPOCH + std::time::Duration::from_secs(1623110400),
	}),
	("sarah".to_owned(), Contestant {
		contact: vec![
			Contact::Matrix("@me:matrix.example".into()),
		],
		country: Country::NO,
		personal_best: std::time::Duration::from_secs(73*60),
		last_seen: std::time::UNIX_EPOCH + std::time::Duration::from_secs(1561879470),
	}),
]).collect());

有关更多示例,请参阅 示例目录。请注意,此目录中的一些示例是对现有数据结构的重新实现,可能包含与先前配置语言的兼容性黑客,导致 Simple Config 中的呈现不佳。

参考

字典

key: value

字典是将键映射到值的映射。键始终是单行值,不包含冒号后的冒号,然而确切的解析取决于类型。

# The type of the key depends on the schema, but these examples can be parsed as the specified type.
true: boolean key
123: integer key
hello: string key

值可以是任意类型。指定值有两种方式。这些值如何解析取决于类型。

key: inline value
key:
	multi
	line
	value

有关解析的完整参考,请参阅值的类型文档。

嵌套

当嵌套时,值必须指定为多行值。

vehicle:
	type: Car
	engine:
		capacity_cc: 200
		mass_g: 60k
	wheels:
		diameter_m: 550m

列表

列表包含多个值。根据模式,顺序可能重要或不重要。

strings:
	string one
	string two
	string three
numbers:
	1
	1k
	1M

默认情况下,列表项是单行长的。要将多行项放入列表中,您必须使用:字符打开一个新级别的缩进。可以混合单行和多行项。请注意,字典必须是多行的。

strings:
	single line string
	:
		multi
		line
		string
	another single line string
dicts:
	:
		species: Cat
		cuteness: 0.99
	:
		species: Dog
		cuteness: 0.8

字符串

字符串可以是单行或多行。目前不允许或必要进行转义,字符串在换行符或注释(#)之前结束,哪个先出现。然而,以双引号"开始的单行字符串是为将来的转义功能保留的。多行字符串将删除前导缩进。请注意,多行字符串中没有特殊字符,包括注释。如果您想在多行字符串中放入注释,则需要使用目标注释格式。

inline: a string # This comment is not part of the string.
out-of-line:
	a string
multi-line: # This comment is not part of the string.
	this
		is
	a
		string
no-comments:
	# This comment is a part of the string.

警告:目前无法指定第一行缩进的字符串。

# WARNING: This example is invalid.
doesnt-work:
		indented first line
	non-indented line

数字

数字可以像预期的那样指定。此外,支持许多后缀以缩放数字。对于相关类型,整数超出范围是错误的。浮点值将是可表示的最近值。

simple-int: 123
simple-float: 3.14

base2: 0b01001011
base8: 0o664
base16: 0xCC

# Currently arbitrary exponents are only supported for base10.
exponents:
	6.022e1023 # 6.022 ⨉ 10^1023
	2.5e-11 # 2.5 ⨉ 10^-11

si-suffixes:
	1E
	1P
	1T
	1G
	1M
	1k # K is also accepted for consistency.
	1m
	1u
	
	1n
	1p
	1f
	1a

iec-sufixes:
	1Ei
	1Pi
	1Ti
	1Gi
	1Mi
	1ki # Ki is also accepted for consistency.
	1mi
	1ui
	1µi
	1ni
	1pi
	1fi
	1ai

布尔值

布尔值指定为truefalse

字节

目前不支持字节。https://gitlab.com/kevincox/simple-config-rs/-/issues/1

可选值

可以指定为空值。

注意:目前无法为Option<String>指定空字符串,它始终表示None。

maybe_none:
maybe_some: 17

注释

注释以#开头,延伸到行尾。注释可以放置在大多数位置。但是请注意,注释不能放置在多行字符串中(它们被认为是字符串的一部分)。

# comment
a-number: # comment
	5
another-number: 5 # comment

a-string: # comment
	hi
multi-line-string: # comment
	hi # NOT COMMENT
	# NOT COMMENT
# comment

list: # comment
	1 # comment
	# comment
	2

# comment

依赖项

~1–1.9MB
~36K SLoC