41个版本 (9个稳定版)
1.0.8 | 2024年5月10日 |
---|---|
1.0.7 | 2024年1月12日 |
1.0.6 | 2023年9月18日 |
1.0.5 | 2022年8月31日 |
0.12.0 | 2021年7月26日 |
#251 在 解析器实现
每月146 次下载
在 2 crates 中使用
120KB
2.5K SLoC
yaml-peg
使用贪心解析算法和PEG原子实现的YAML 1.2解析器。支持锚点、指令、位置、标签、serde和无std。
灵感来源于yaml-rust
和 serde-yaml
。
该解析器不保证符合YAML规范,但几乎所有功能都已良好实现。缓冲区读取器尚未实现,但可以通过子解析器读取块。
解析后,加载器可以访问锚点。
use yaml_peg::{parse, node};
let doc = "
---
name: Bob
married: true
age: 46
";
let root = parse(doc).unwrap();
assert_eq!(root, vec![node!({
"name" => "Bob",
"married" => true,
"age" => 46,
})]);
有关更多信息,请参阅API文档。
功能
-
支持无标准库
#![no_std]
。 -
不同的数据持有者
Rc
/Arc
提供并行访问和更低的复制成本。 -
在节点上提供文档位置和标签。
-
支持锚点/别名。
- 直接模式:直接嵌入别名。
- 循环模式:保留别名占位符,用于循环数据。
-
支持YAML指令
YAML
和TAG
。警告:
%YAML 1.1
仍将视为1.2。%YAML 1.2 %TAG !x! tag:my.prefix: ---
-
支持
serde
以帮助您序列化和反序列化特定类型。(以及非循环锚点)use serde::Deserialize; use yaml_peg::serde::from_str; #[derive(Deserialize)] struct Member { name: String, married: bool, age: u8, } let doc = " --- name: Bob married: true age: 46 "; // Return Vec<Member>, use `.remove(0)` to get the first one let officer = from_str::<Member>(doc).unwrap().remove(0); assert_eq!("Bob", officer.name); assert!(officer.married); assert_eq!(46, officer.age);
依赖关系
~1MB
~17K SLoC