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());
}