#visitor #macro-derive #derive #macro

derive-visitor-macros

derive-visitor 包的宏

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.0 2021年10月15日

#2461开发工具

Download history 2623/week @ 2024-03-14 2462/week @ 2024-03-21 2418/week @ 2024-03-28 1358/week @ 2024-04-04 1482/week @ 2024-04-11 1683/week @ 2024-04-18 1726/week @ 2024-04-25 1360/week @ 2024-05-02 3105/week @ 2024-05-09 2223/week @ 2024-05-16 988/week @ 2024-05-23 2043/week @ 2024-05-30 2015/week @ 2024-06-06 1364/week @ 2024-06-13 2240/week @ 2024-06-20 1854/week @ 2024-06-27

每月下载量 7,927
2 个包中使用(通过 derive-visitor

MIT 许可证

20KB
500

此包为任意数据结构推导 访问者模式。此模式在处理复杂嵌套数据结构、抽象树和各种层次结构时特别有用。

此包的主要构建块是两个可推导特性

  • 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);

lib.rs:

这是一个为 derive-visitor 提供的实用程序包

依赖关系

~2MB
~45K SLoC