#ini-parser #config-parser #ini #parser #streaming-parser #configuration

ini_core

实现了一个非常基础的流式 INI 解析器

2 个不稳定版本

0.2.0 2023 年 2 月 5 日
0.1.0 2021 年 7 月 19 日

#230配置

35 每月下载量
用于 2 crates

MIT 许可证

27KB
496

Ini 流式解析器

MIT License crates.io docs.rs Build status

兼容 no_std

这个库实现了一个非常基础但非常快速的流式 INI 解析器。

示例

use ini_core as ini;

let document = "\
[SECTION]
;this is a comment
Key=Value";

let elements = [
	ini::Item::SectionEnd,
	ini::Item::Section("SECTION"),
	ini::Item::Comment("this is a comment"),
	ini::Item::Property("Key", Some("Value")),
	ini::Item::SectionEnd,
];

for (index, item) in ini::Parser::new(document).enumerate() {
	assert_eq!(item, elements[index]);
}

SectionEnd 伪元素在新的部分之前和文档末尾返回。这有助于在解析完属性后处理部分。

解析器非常基于行,它会继续进行,并返回作为项目的无意义内容

use ini_core as ini;

let document = "\
[SECTION
nonsense";

let elements = [
	ini::Item::SectionEnd,
	ini::Item::Error("[SECTION"),
	ini::Item::Property("nonsense", None),
	ini::Item::SectionEnd,
];

for (index, item) in ini::Parser::new(document).enumerate() {
	assert_eq!(item, elements[index]);
}

[ 开头的行,但既没有闭合的 ] 也没有后跟换行的闭合 ],作为 Item::Error 返回。缺少 = 的行作为 Item::Property 返回,其值为 None

格式

INI 不是一个良好指定的格式,这个解析器尽量少做假设,但确实做出了决定。

  • 换行符可以是 "\r\n""\n""\r"。它们可以在单个文档中混合使用,但这不是推荐的。
  • 部分标题是 "" section " 换行符section 可以是任何内容,但不能包含换行符。
  • 属性是 key "=" value 换行符keyvalue 可以是任何内容,但不能包含换行符。
  • 注释是 ";" comment newline,空白则是仅仅 newline。注释字符可以自定义。

请注意,默认情况下不会去除填充空格:节 [ SECTION ] 的名称是 <space>SECTION<space>。属性 KEY = VALUE 有键 KEY<space> 和值 <space>VALUE。注释 ; comment 的注释是 <space>comment

输入不会进行进一步处理,例如,如果需要转义序列,则必须由用户处理。

性能

与其他在crates.io上可用的INI解析器进行了测试。警告:除 light_ini 之外的所有解析器都使用文档模型,使用 HashMapString 分配内存,这并不完全公平...无论如何,ini_core 仍然以回调为基础的流式解析器 light_ini 为标准。

这些测试是在AMD Ryzen 5 3600X上,使用 -C target-cpu=native 运行的。

解析大型INI文件(241 KB,7640行)

running 5 tests
test configparser ... bench:   1,921,162 ns/iter (+/- 207,479) = 128 MB/s
test ini_core     ... bench:      99,860 ns/iter (+/- 2,396) = 2472 MB/s
test light_ini    ... bench:     320,363 ns/iter (+/- 33,904) = 770 MB/s
test simpleini    ... bench:   7,814,605 ns/iter (+/- 271,016) = 31 MB/s
test tini         ... bench:   2,613,870 ns/iter (+/- 188,756) = 94 MB/s

test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured; 0 filtered out; finished in 19.99s

解析小型INI文件(17.2 KB,800行)

running 5 tests
test configparser ... bench:     266,602 ns/iter (+/- 21,394) = 66 MB/s
test ini_core     ... bench:       8,179 ns/iter (+/- 845) = 2159 MB/s
test light_ini    ... bench:     149,990 ns/iter (+/- 16,379) = 117 MB/s
test simpleini    ... bench:     563,204 ns/iter (+/- 55,080) = 31 MB/s
test tini         ... bench:     340,383 ns/iter (+/- 28,667) = 51 MB/s

test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured; 0 filtered out; finished in 15.75s

竞争者连边都沾不上。😎

许可证

根据 MIT许可证 许可,请参阅 license.txt

贡献

除非你明确表示,否则你提交的任何有意包含在作品中的贡献,都应按照上述方式许可,不附加任何其他条款或条件。

依赖关系