relay_event_derive/
utils.rs

1use proc_macro2::TokenStream;
2use quote::ToTokens;
3use synstructure::{Structure, VariantInfo};
4
5pub trait SynstructureExt {
6    fn try_each_variant<F, R>(&self, f: F) -> syn::Result<TokenStream>
7    where
8        F: FnMut(&VariantInfo<'_>) -> syn::Result<R>,
9        R: ToTokens;
10}
11
12impl SynstructureExt for Structure<'_> {
13    fn try_each_variant<F, R>(&self, mut f: F) -> syn::Result<TokenStream>
14    where
15        F: FnMut(&VariantInfo<'_>) -> syn::Result<R>,
16        R: ToTokens,
17    {
18        let mut t = TokenStream::new();
19        for variant in self.variants() {
20            let pat = variant.pat();
21            let body = f(variant)?;
22            quote::quote!(#pat => { #body }).to_tokens(&mut t);
23        }
24        if self.omitted_variants() {
25            quote::quote!(_ => {}).to_tokens(&mut t);
26        }
27        Ok(t)
28    }
29}