#vec #collection #iterator #codegen #vector

wrapped-vec

用于生成包装 Vec 类型和相关样板代码的宏

5 个不稳定版本

0.3.0 2021 年 1 月 13 日
0.2.1 2017 年 11 月 17 日
0.2.0 2017 年 11 月 16 日
0.1.1 2017 年 10 月 27 日
0.1.0 2017 年 10 月 27 日

#161 in #codegen

Download history 127/week @ 2024-03-25 215/week @ 2024-04-01 97/week @ 2024-04-08 136/week @ 2024-04-15 134/week @ 2024-04-22 157/week @ 2024-04-29 169/week @ 2024-05-06 135/week @ 2024-05-13 152/week @ 2024-05-20 177/week @ 2024-05-27 128/week @ 2024-06-03 130/week @ 2024-06-10 149/week @ 2024-06-17 143/week @ 2024-06-24 142/week @ 2024-07-01 153/week @ 2024-07-08

每月下载 611 次
用于 4 crate(其中 2 个直接使用)

MIT/Apache

13KB
206

wrapped-vec

Latest Version Build Status

wrapped-vec 是一个 Rust crate,用于自动生成包装在自定义类型中的 Vectors 的类型定义和样板代码。它导出了一个 WrappedVec 自定义 derive proc-macro,该宏为任何类型生成一个命名的包装器。例如

#[derive(WrappedVec)]
#[CollectionName="ExampleCollection"]
pub struct ExampleType { ... };

将生成

pub struct ExampleCollection(Vec<ExampleType>)

自动生成大量有用的 trait 实现,包括 IterIntoIterExpand,以及一些有用的 Vec 风格的方法,如 len()iter()is_empty()

WrappedVec 有助于您避免暴露库实现细节或创建在 plain Vec 不再提供正确功能时易碎的 API。类型同义词给集合一个自定义名称,但无法解决这些问题。简单地将 Vec 包装在自定义类型中的常见解决方案需要手动实现诸如 Iter 等常见有用集合特质,这涉及大量样板代码。针对 Vec 实现 Deref 提供基本的 Vec 方法,但仍然需要手动实现集合特质。

用法

wrapped-vec 添加到您的 Cargo.toml

wrapped-vec = "0.2"

导入带有宏的 crate

#[macro_use]
use wrapped_vec;

然后推导您的自定义集合,就像使用普通的 Vec

#[derive(WrappedVec)]
#[CollectionName="TaskBatch"]
pub struct Task { ... };

let batch = TaskBatch::from_iter(vec![Task(), Task()]);
for task in batch {
    task.doWork()
}

生成的类型文档

WrappedVec 自动生成导出的 Vec 类型及其上实现的方法的文档。然而,您可能希望覆盖自动生成的文档,这可以通过自定义属性完成

#[derive(WrappedVec)]
#[CollectionName="TaskBatch"]
#[CollectionDoc="A batch of tasks to be run either in serial or parallel by a TaskRunner"]
pub struct Task { ... };

大致相当于

/// A batch of tasks to be run either in serial or parallel by a TaskRunner
pub struct TaskBatch(Vec<Task>);

可用的文档属性有

属性 文档
CollectionDoc 结构 CollectionName
CollectionNewDoc CollectionName::
CollectionLenDoc CollectionName::len
CollectionIsEmptyDoc CollectionName::is_empty
CollectionIterDoc CollectionName::iter

关于特例方法的文档将自动从父特例文档中生成,并且目前无法被覆盖。

为生成的集合推导特例

可以使用 CollectionDerives 属性来指定将在生成的集合类型上推导的特例。要推导的特例以逗号分隔的字符串形式指定。省略 CollectionDerives 属性或传递空字符串将不会生成任何特例推导。

#[derive(Clone, Debug, WrappedVec)]
#[CollectionName="TaskBatch"]
#[CollectionDerives="Clone, Debug"]
pub struct Task { ... };

将生成

#[derive(Clone, Debug)]
pub struct TaskBatch(Vec<Task>);

许可

许可方式为以下之一

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您提交给作品的所有贡献,将按照上述方式双重许可,无需任何附加条款或条件。

依赖关系

~1.5MB
~35K SLoC