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
7mod 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 quote!(
26 pub enum #message_name {
27 #message_variants
28 }
29 pub enum #response_name {
30 #response_variants
31 }
32 )
33}