derive_io_plugin/
lib.rs

1#![feature(proc_macro_quote, extend_one, let_chains)]
2
3use proc_macro::{TokenStream, quote};
4use quote::format_ident;
5use syn::{DeriveInput, Data, parse_macro_input};
6
7// use crate::variants::split_enum_variants;
8mod variants;
9
10#[proc_macro_derive(IoPlugin)]
11pub fn io_plugin_derive(input: TokenStream) -> TokenStream { 
12    let input: DeriveInput = parse_macro_input!(input as DeriveInput);
13    
14    let name = &input.ident;
15    let message_name = format_ident!("{name}Message");
16    let response_name = format_ident!("{name}Response");
17    let data = match &input.data {
18        Data::Enum(data) => data,
19        _ => panic!("IoPlugin can only be derived for enums")
20    };
21    
22    // let (message_variants, response_variants) = split_enum_variants(data.variants);   
23    
24
25    quote!(
26        pub enum #message_name {
27            #message_variants
28        }
29        pub enum #response_name {
30            #response_variants
31        }
32    )
33}