11个版本
0.3.2 | 2023年6月12日 |
---|---|
0.3.1 | 2023年6月12日 |
0.3.0 | 2023年5月24日 |
0.2.0 | 2023年5月17日 |
0.1.5 | 2022年7月30日 |
#11 in #yaml-parser
267 每月下载量
用于 roead
235KB
2.5K SLoC
ryml: Rust的Rapid YAML绑定
Rapid YAML/ryml 是一个用于解析和生成YAML的C++库,运行速度快。ryml包提供了相对薄的但安全(我认为)的FFI绑定,将这种能力带到Rust中。
这个包目前处于非常早期的alpha阶段。不是所有的C++ API都被覆盖,其中一些可能也不会被覆盖,但核心功能都已就位(实际上,比官方的Python绑定还要多)。
使用
如何使用此包的基本示例
use ryml::Tree;
static SRC: &str = r#"
Hello: World
Names: [Caleb, Voronwe, 'Nicene Nerd']
Credo: !!apostolicus
- in Deum, Patrem omnipotentem
- et in Iesum Christum, Filium eius unicum
- in Spiritum Sanctum
"#;
let mut tree = Tree::parse(SRC)?;
assert_eq!(10, tree.len());
// First, the low-level, index-based API
let root_id = tree.root_id()?;
assert_eq!(root_id, 0);
assert_eq!(tree.num_children(root_id)?, 3);
for i in 0..tree.num_children(root_id)? {
let child_id = tree.child_at(root_id, i)?;
println!("{}", tree.key_scalar(child_id)?.scalar); // "Hello", "Names", "Credo"
}
// Next, the high-level, NodeRef API
let world = tree.root_ref()?.get("Hello")?;
assert_eq!(world.val()?, "World");
let credo = tree.root_ref()?.get("Credo")?;
assert!(credo.is_seq()?);
assert_eq!(credo.val_tag()?, "!!apostolicus");
for node in credo.iter()? {
println!("{}", node.val()?);
}
// Mutate the tree
{
let mut root_ref_mut = tree.root_ref_mut()?;
let mut credo = root_ref_mut.get_mut("Credo")?;
let mut amen = credo.get_mut(3)?; // A new index
amen.set_val("Amen")?;
}
// Serialize the tree back to a string
let new_text = tree.emit()?;
static END: &str = r#"Hello: World
Names:
- Caleb
- Voronwe
- 'Nicene Nerd'
Credo: !!apostolicus
- 'in Deum, Patrem omnipotentem'
- 'et in Iesum Christum, Filium eius unicum'
- in Spiritum Sanctum
- Amen
"#;
assert_eq!(new_text, END);
有关更多信息,请参阅完整文档。
贡献
问题跟踪器:https://github.com/NiceneNerd/ryml/issues
源代码:https://github.com/NiceneNerd/ryml
一些欢迎的事项
- 任何可以改进错误处理的事情
no_std
支持是一个最终目标- 安全性改进
- 绝对需要更多的测试和其他内容
许可证
依赖关系
~2–28MB
~376K SLoC