strum_macros/macros/strings/
mod.rs

1use proc_macro2::TokenStream;
2use quote::quote;
3use syn::{Fields, Ident, Variant};
4
5pub mod as_ref_str;
6pub mod display;
7pub mod from_string;
8pub mod to_string;
9
10struct NonSingleFieldEnum;
11
12fn extract_single_field_variant_and_then<F>(
13    name: &Ident,
14    variant: &Variant,
15    return_val_fn: F,
16) -> Result<TokenStream, NonSingleFieldEnum>
17where
18    F: Fn(&TokenStream) -> TokenStream,
19{
20    let variant_ident = &variant.ident;
21
22    let pattern_and_return = match &variant.fields {
23        Fields::Unnamed(f) if f.unnamed.len() == 1 => {
24            let ident = &quote! { field0 };
25            let ref_kw = match f.unnamed.last().unwrap().ty {
26                syn::Type::Reference(..) => quote! { },
27                _ => quote! { ref },
28            };
29
30            let ret_val = return_val_fn(ident);
31            quote! { (#ref_kw #ident) => #ret_val }
32        }
33        Fields::Named(f) if f.named.len() == 1 => {
34            let field = f.named.last().unwrap();
35            let ref_kw = match field.ty {
36                syn::Type::Reference(..) => quote! { },
37                _ => quote! { ref },
38            };
39
40            let ident = field.ident.as_ref().unwrap();
41            let ident = &quote! { #ident };
42            let ret_val = return_val_fn(ident);
43            quote! { { #ref_kw #ident} => #ret_val }
44        }
45        _ => return Err(NonSingleFieldEnum),
46    };
47
48    Ok(quote! { #name::#variant_ident #pattern_and_return })
49}