fmc_protocol_derive 0.1.0

Derive macros for fmc_protocol
Documentation
use proc_macro::TokenStream;

use quote::quote;
use syn::{parse_macro_input, DeriveInput};

#[proc_macro_derive(ServerBound)]
pub fn derive_server_message(input: TokenStream) -> TokenStream {
    let ast = parse_macro_input!(input as DeriveInput);

    let struct_name = &ast.ident;
    let (impl_generics, type_generics, where_clause) = &ast.generics.split_for_impl();

    TokenStream::from(quote! {
        impl #impl_generics crate::network_message::ServerBound for #struct_name #type_generics #where_clause {
            const TYPE: crate::MessageType = crate::MessageType::#struct_name;
        }
    })
}

#[proc_macro_derive(ClientBound)]
pub fn derive_client_message(input: TokenStream) -> TokenStream {
    let ast = parse_macro_input!(input as DeriveInput);

    let struct_name = &ast.ident;
    let (impl_generics, type_generics, where_clause) = &ast.generics.split_for_impl();

    TokenStream::from(quote! {
        impl #impl_generics crate::network_message::ClientBound for #struct_name #type_generics #where_clause {
            const TYPE: crate::MessageType = crate::MessageType::#struct_name;
        }
    })
}