relay_event_derive/
utils.rs1use 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}