#yaml-parser #yaml #bindings #safe-bindings #ffi #rapidyaml

no-std ryml

快速解析YAML:Rust的Rapid YAML绑定

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

Download history 60/week @ 2024-03-13 42/week @ 2024-03-20 62/week @ 2024-03-27 70/week @ 2024-04-03 44/week @ 2024-04-10 69/week @ 2024-04-17 63/week @ 2024-04-24 51/week @ 2024-05-01 41/week @ 2024-05-08 51/week @ 2024-05-15 60/week @ 2024-05-22 67/week @ 2024-05-29 69/week @ 2024-06-05 64/week @ 2024-06-12 74/week @ 2024-06-19 52/week @ 2024-06-26

267 每月下载量
用于 roead

GPL-3.0-or-later

235KB
2.5K SLoC

ryml: Rust的Rapid YAML绑定

GPL 3 Crates.io version GitHub issues

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支持是一个最终目标
  • 安全性改进
  • 绝对需要更多的测试和其他内容

许可证

该项目采用GPLv3+许可证。原始ryml库采用MIT许可证

依赖关系

~2–28MB
~376K SLoC