5 个版本 (3 个破坏性更新)
0.4.0 | 2024年5月26日 |
---|---|
0.3.0 | 2022年9月5日 |
0.2.1 | 2022年7月19日 |
0.1.2 | 2022年7月18日 |
0.1.1 | 2021年10月16日 |
#205 在 开发工具
每月下载量 7,424
用于 2 个 Crates(通过 databend-common-ast)
30KB
415 代码行
此 crate 为任意数据结构派生访问者模式。此模式在处理复杂嵌套数据结构、抽象树和各种类型的层次结构时特别有用。
此 crate 的主要构建块是两个可派生特性
请参阅这些特性的文档以获取更多详细信息。
示例
use derive_visitor::{Visitor, Drive};
#[derive(Drive)]
struct Directory {
#[drive(skip)]
name: String,
items: Vec<DirectoryItem>,
}
#[derive(Drive)]
enum DirectoryItem {
File(File),
Directory(Directory),
}
#[derive(Drive)]
struct File {
#[drive(skip)]
name: String,
}
#[derive(Visitor, Default)]
#[visitor(File(enter), Directory(enter))]
struct Counter {
files: u32,
directories: u32
}
impl Counter {
fn enter_file(&mut self, _file: &File) {
self.files += 1;
}
fn enter_directory(&mut self, _directory: &Directory) {
self.directories += 1;
}
}
let mut counter = Counter::default();
let example_directory = Directory {
name: "root".into(),
items: vec![
DirectoryItem::Directory(
Directory {
name: "home".into(),
items: vec![
DirectoryItem::File(File { name: "README.md".into() }),
DirectoryItem::File(File { name: "Star Wars.mov".into() })
]
}
),
DirectoryItem::Directory(
Directory { name: "downloads".into(), items: vec![] }
)
],
};
example_directory.drive(&mut counter);
assert_eq!(counter.files, 2);
assert_eq!(counter.directories, 3);
依赖
~2MB
~45K SLoC