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
每月下载 611 次
用于 4 个 crate(其中 2 个直接使用)
13KB
206 行
wrapped-vec
wrapped-vec 是一个 Rust crate,用于自动生成包装在自定义类型中的 Vectors 的类型定义和样板代码。它导出了一个 WrappedVec
自定义 derive proc-macro,该宏为任何类型生成一个命名的包装器。例如
#[derive(WrappedVec)]
#[CollectionName="ExampleCollection"]
pub struct ExampleType { ... };
将生成
pub struct ExampleCollection(Vec<ExampleType>)
自动生成大量有用的 trait 实现,包括 Iter
、IntoIter
和 Expand
,以及一些有用的 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 License,版本 2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您提交给作品的所有贡献,将按照上述方式双重许可,无需任何附加条款或条件。
依赖关系
~1.5MB
~35K SLoC