Function synstructure::each_variant
[−]
[src]
pub fn each_variant<F, T: ToTokens>(
input: &MacroInput,
options: &BindOpts,
func: F
) -> Tokens where
F: FnMut(Vec<BindingInfo>, &Variant) -> T,
This method calls func
once per variant in the struct or enum, and generates
a series of match branches which will destructure a the input, and run the result
of func
once for each of the variants.
The second argument to func
is a syn Variant
object. This object is
fabricated for struct-like MacroInput
parameters.
Example
extern crate syn; extern crate synstructure; #[macro_use] extern crate quote; use synstructure::{each_variant, BindStyle}; fn main() { let mut ast = syn::parse_macro_input("enum A { B(i32, i32), C }").unwrap(); let tokens = each_variant(&mut ast, &BindStyle::Ref.into(), |bindings, variant| { let name_str = variant.ident.as_ref(); if name_str == "B" { assert_eq!(bindings.len(), 2); assert_eq!(bindings[0].ident.as_ref(), "__binding_0"); assert_eq!(bindings[1].ident.as_ref(), "__binding_1"); } else { assert_eq!(name_str, "C"); assert_eq!(bindings.len(), 0); } quote!(#name_str) }); assert_eq!(tokens.to_string(), quote! { A::B(ref __binding_0, ref __binding_1,) => { "B" } A::C => { "C" } }.to_string()); }