extern crate proc_macro;
use proc_macro::TokenStream;
use syn::parse_macro_input;
mod packet;
use packet::{PacketId, PacketConfig, implement_packet};
#[proc_macro_attribute]
pub fn packet(args: TokenStream, input: TokenStream) -> TokenStream {
let packet_id = parse_macro_input!(args as PacketId);
let input = parse_macro_input!(input as syn::DeriveInput);
match implement_packet(packet_id.value, &input) {
Ok(tokens) => tokens.into(),
Err(e) => e.to_compile_error().into(),
}
}
#[proc_macro]
pub fn id_to_packet(input: TokenStream) -> TokenStream {
let packet_config = parse_macro_input!(input as PacketConfig);
let expanded = packet::generate_function_with_consts(&packet_config.packets, &packet_config.null_packet);
TokenStream::from(expanded)
}
#[proc_macro_attribute]
pub fn substruct(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as syn::DeriveInput);
match packet::implement_subdata(&input) {
Ok(tokens) => tokens.into(),
Err(e) => e.to_compile_error().into(),
}
}
#[proc_macro]
pub fn id_to_packet_with_consts(input: TokenStream) -> TokenStream {
let packet_config = parse_macro_input!(input as PacketConfig);
let expanded = packet::generate_function_with_consts(&packet_config.packets, &packet_config.null_packet);
TokenStream::from(expanded)
}
mod packet_match;
#[proc_macro]
pub fn packet_match(input: TokenStream) -> TokenStream {
packet_match::parse_packet_match(input)
}