#serialization #text-format #s-expr

nightly wood

一种易于加工的坚固材料:termpose 和 woodslist 的解析、序列化和反序列化

14 个版本 (8 个重大变更)

0.10.0 2024年4月14日
0.9.0 2023年8月11日
0.8.0 2022年7月12日
0.5.0 2021年5月2日
0.4.2 2019年5月30日

#990 in 解析器实现

Download history 26/week @ 2024-04-27 9/week @ 2024-06-29 59/week @ 2024-07-06

每月700次下载
wood_derive 中使用

MIT 许可证

80KB
2K SLoC

Rust Wood

crates.io crates.io

Wood 是一种非常简单的序列化数据类型,由嵌套字符串列表组成。

Termpose、Nakedlist 和 Woodslist 是可以解析为 Wood 的文本格式。

当前 Rust 库对 termpose 和 woodslist 有出色的支持。

API 文档

示例

extern crate wood;
use wood::{parse_woodslist, dewoodify};

fn main(){
  let r:Vec<usize> = dewoodify(&parse_woodslist("0 1 2").unwrap()).unwrap();
  
  assert_eq!(2, r[2]); //easy as zero one two
}

尽管 Wood 的自动派生功能不如 serde 完善(也许我们应该为它创建一个 serde crate),但它确实存在并且可以工作。

extern crate wood;
extern crate wood_derive;
use wood::{parse_termpose, pretty_termpose, Woodable, Dewoodable};
use wood_derive::{Woodable, Dewoodable};

#[derive(Woodable, Dewoodable, PartialEq, Debug)]
struct Dato {
  a:String,
  b:bool,
}

fn main(){
  let od = Dato{a:"chock".into(), b:true};
  let s = pretty_termpose(&od.woodify());
  
  assert_eq!("Dato a:chock b:true", &s);
  
  let d = parse_termpose(&s).and_then(|sw| Dato::dewoodify(&sw)).unwrap();
  
  assert_eq!(&od, &d);
}

还有称为 wooder 组合器的东西。由于各种原因,我还没有找到在 Rust 中真正有用它们的方法,但它们将是(通常是)零大小的值,您可以组装它们以指定 wood 和数据之间的转换(您通常一次解释两个方向。我想称它们为“双函数”)。

extern crate wood;
extern crate wood_derive;
use wood::{wooder, Wood, Dewooder, parse_multiline_termpose};
use wood_derive::{Woodable, Dewoodable};

#[derive(Woodable, Dewoodable)]
struct Datu {
  name: String,
  numbers: Vec<u32>,
}

fn main(){
  let data:Wood = parse_multiline_termpose("
  
list
  entry 1
  entry 2
  sublist
    Datu name:n numbers(0 1 2)
    Datu name:nnn numbers(0 1 2)
  entry 3
  
").unwrap();
  
  let sublist:&Wood = data.find("list").and_then(|l| l.find("sublist")).unwrap();
  
  let _:Vec<Datu> = wooder::TaggedSequenceBi("sublist", wooder::Iden).dewoodify(sublist).unwrap();
}

无运行时依赖