wrapped-vec

Crates.iowrapped-vec
lib.rswrapped-vec
version0.3.0
sourcesrc
created_at2017-10-27 12:57:21.946031
updated_at2021-01-13 11:37:28.463588
descriptionMacro for generating wrapped Vec types and associated boilerplate
homepage
repositoryhttps://github.com/bobbo/wrapped-vec
max_upload_size
id37121
size26,606
David Futcher (bobbo)

documentation

README

wrapped-vec

Latest Version Build Status

wrapped-vec is a Rust crate for auto-generating type definitions and boilerplate code for wrapping Vectors in a custom type. It exports a WrappedVec custom-derive proc-macro that generates a named wrapper over Vec for any type. For example:

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

will generate

pub struct ExampleCollection(Vec<ExampleType>)

A large number of useful trait impls are auto-generated, including Iter, IntoIter & Expand, plus a small number of useful Vec-style methods like len(), iter() & is_empty().

WrappedVec helps you avoid exposing library implementation details or creating brittle APIs that break when plain Vec doesn't provide the right functionality any more. Type synonyms give collections a custom name but don't address these issues. The common workaround of simply wrapping Vec with a custom type requires manually implementing common useful collection traits such as Iter, which involves a lot of boilerplate. Implementing Deref targetting Vec provides the basic Vec methods, but still requires manual implementation of collection traits.

Usage

Add wrapped-vec to your Cargo.toml:

wrapped-vec = "0.2"

Import the crate with macros:

#[macro_use]
use wrapped_vec;

Then derive your custom collection and use just like a plain Vec:

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

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

Generated Type Documentation

WrappedVec automatically generates documentation for the derived Vec type and the methods implemented on it. However, you may wish to override the automated documentation, which can be done with custom attributes:

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

is roughly equivalent to

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

Documentation attributes available are:

Attribute Documents
CollectionDoc struct CollectionName
CollectionNewDoc CollectionName::new
CollectionLenDoc CollectionName::len
CollectionIsEmptyDoc CollectionName::is_empty
CollectionIterDoc CollectionName::iter

Documentation for trait methods are auto-populated from the parent trait documentation and not currently overridable.

Deriving Traits for Generated Collections

The CollectionDerives attribute can be used to specify traits which will be derived on the generated collection type. Traits to be derived are specified as a comma-separated list in a string. Omitting the CollectionDerives attribute, or passing an empty string, causes no trait derivations to be generated.

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

will generate

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

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Commit count: 26

cargo fmt