rdc_macros/
lib.rs

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/// Derive macro for generating code for the `rdc` crate.
28/// Supported types are structs, enums and primitive types.
29#[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}