enum_delegate_lib/macros/
implement_conversions.rs1use 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#[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}