[−][src]Function derive_utils::derive_trait
pub fn derive_trait<I>(
data: &EnumData,
trait_path: Path,
supertraits_types: I,
trait_def: ItemTrait
) -> Result<TokenStream> where
I: IntoIterator<Item = Ident>,
I::IntoIter: ExactSizeIterator,
A function for creating proc_macro_derive
like deriving trait to enum so long as all variants are implemented that trait.
Examples
use derive_utils::derive_trait; use proc_macro::TokenStream; use quote::format_ident; use syn::{parse_macro_input, parse_quote}; #[proc_macro_derive(Iterator)] pub fn derive_iterator(input: TokenStream) -> TokenStream { derive_trait( &parse_macro_input!(input), // trait path parse_quote!(std::iter::Iterator), // super trait's associated types None, // trait definition parse_quote! { trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>; fn size_hint(&self) -> (usize, Option<usize>); } }, ) .unwrap_or_else(|e| e.to_compile_error()) .into() } #[proc_macro_derive(ExactSizeIterator)] pub fn derive_exact_size_iterator(input: TokenStream) -> TokenStream { derive_trait( &parse_macro_input!(input), // trait path parse_quote!(std::iter::ExactSizeIterator), // super trait's associated types Some(format_ident!("Item")), // trait definition parse_quote! { trait ExactSizeIterator: Iterator { fn len(&self) -> usize; } }, ) .unwrap_or_else(|e| e.to_compile_error()) .into() }