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开发工具

Download history 1664/week @ 2024-05-03 3255/week @ 2024-05-10 1924/week @ 2024-05-17 1134/week @ 2024-05-24 2095/week @ 2024-05-31 2052/week @ 2024-06-07 1277/week @ 2024-06-14 2208/week @ 2024-06-21 2520/week @ 2024-06-28 2369/week @ 2024-07-05 2298/week @ 2024-07-12 1989/week @ 2024-07-19 1901/week @ 2024-07-26 2007/week @ 2024-08-02 1421/week @ 2024-08-09 1811/week @ 2024-08-16

每月下载量 7,424
用于 2 个 Crates(通过 databend-common-ast

MIT 许可证

30KB
415 代码行

此 crate 为任意数据结构派生访问者模式。此模式在处理复杂嵌套数据结构、抽象树和各种类型的层次结构时特别有用。

此 crate 的主要构建块是两个可派生特性

  • Visitor 实现遍历数据结构并累积一些信息;
  • Drive 实现是知道如何通过自己驱动访问者的数据结构。

请参阅这些特性的文档以获取更多详细信息。

示例

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