1use proc_macro::TokenStream;
2use syn::{DeriveInput, Variant};
3use crate::codegen::data_enums::generate_data_enum_code;
4use crate::codegen::structs::generate_struct_code;
5use crate::codegen::unit_enums::generate_unit_enum_code;
6
7mod utils;
8mod targets;
9mod codegen;
10
11fn generate_code(input: &DeriveInput) -> proc_macro2::TokenStream {
12 match &input.data {
13 syn::Data::Struct(data) => {
14 generate_struct_code(input, data)
15 },
16 syn::Data::Enum(enum_data) => {
17 if enum_data.variants.iter().all(|variant: &Variant| variant.fields.len() == 0) {
18 generate_unit_enum_code(input, enum_data)
19 } else {
20 generate_data_enum_code(input, enum_data)
21 }
22 },
23 syn::Data::Union(_) => panic!("Unions are not supported"),
24 }
25}
26
27#[proc_macro_derive(RDC, attributes(serde))]
30pub fn derive_rdc(input: TokenStream) -> TokenStream {
31 let input = syn::parse_macro_input!(input as syn::DeriveInput);
32 generate_code(&input).into()
33}