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 解析器实现
每月700次下载
在 wood_derive 中使用
80KB
2K SLoC
Rust Wood
Wood 是一种非常简单的序列化数据类型,由嵌套字符串列表组成。
Termpose、Nakedlist 和 Woodslist 是可以解析为 Wood 的文本格式。
当前 Rust 库对 termpose 和 woodslist 有出色的支持。
示例
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();
}