A procedural macro helper for easily writing [custom derives] for enums.
Add this to your Cargo.toml
:
toml
[dependencies]
derive_utils = "0.8"
The current derive_utils requires Rust 1.31 or later.
quick_derive!
macro make easy to write proc_macro_derive
like deriving trait to enum so long as all variants are implemented that trait.
```rust extern crate proc_macro;
use deriveutils::quickderive; use proc_macro::TokenStream;
pub fn deriveiterator(input: TokenStream) -> TokenStream {
quickderive! {
input,
// trait
trait Iterator {
type Item;
fn next(&mut self) -> Option
pub fn deriveexactsizeiterator(input: TokenStream) -> TokenStream { quickderive! { input, // super trait's associated types Item, // trait trait ExactSizeIterator: Iterator { fn len(&self) -> usize; } } }
pub fn derivefusediterator(input: TokenStream) -> TokenStream { quick_derive! { input, // super trait's associated types Item, // path (std::iter::FusedIterator), // trait trait FusedIterator: Iterator {}, } }
pub fn derivefuture(input: TokenStream) -> TokenStream {
quickderive! {
input,
// path
(std::future::Future),
// trait
trait Future {
type Output;
fn poll(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>)
-> std::task::Poll
When deriving for enum like the following:
```rust
enum Enum { A(A), B(B), } ```
Code like this will be generated:
```rust enum Enum { A(A), B(B), }
impl Iterator for Enum
where
A: Iterator,
B: Iterator
impl ExactSizeIterator for Enum
where
A: ExactSizeIterator,
B: ExactSizeIterator
impl std::iter::FusedIterator for Enum
where
A: std::iter::FusedIterator,
B: std::iter::FusedIterator
impl std::future::Future for Enum where A: std::future::Future, B: std::future::Future
fn poll(
self: std::pin::Pin<&mut Self>,
cx: &mut std::task::Context<'_>,
) -> std::task::Poll<Self::Output> {
unsafe {
match self.get_unchecked_mut() {
Enum::A(x) => std::pin::Pin::new_unchecked(x).poll(cx),
Enum::B(x) => std::pin::Pin::new_unchecked(x).poll(cx),
}
}
}
} ```
Licensed under either of
at your option.
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.