enum_delegate_lib/macros/
implement_conversions.rs

1use proc_macro2::TokenStream;
2use quote::{quote, quote_spanned};
3use syn::spanned::Spanned;
4use syn::{parse2, parse_quote, ItemEnum};
5
6use crate::generate::enum_conversion::generate_enum_conversions;
7use crate::input::single_field_enum::parse_enum_variants;
8
9/// The `implement_conversions` macro implementation.
10///
11/// See the `enum_delegate` crate for more information.
12// we're mirroring how macro signatures look
13#[allow(clippy::needless_pass_by_value)]
14#[must_use]
15pub fn implement_conversions(attribute_args: TokenStream, item: TokenStream) -> TokenStream {
16    if !attribute_args.is_empty() {
17        let span = attribute_args.span();
18        return quote_spanned!(span => compile_error!("this macro does not accept arguments"););
19    }
20
21    let item_enum: ItemEnum = match parse2(item.clone()) {
22        Ok(parsed) => parsed,
23        Err(error) => return error.to_compile_error(),
24    };
25
26    let parsed_enum = match parse_enum_variants(&item_enum) {
27        Ok(parsed) => parsed,
28        Err(error) => {
29            return error.into_compiler_error();
30        }
31    };
32
33    let enum_name = &item_enum.ident;
34    let enum_conversions = generate_enum_conversions(&parse_quote!(#enum_name), &parsed_enum);
35
36    quote! {
37        #item
38        #enum_conversions
39    }
40}