elvwlc

2 commits
Updated 2026-06-10 17:49:22
derive/src
derive/src/lib.rs
use darling::*;
use proc_macro2::TokenStream;
use quote::*;
use syn::*;

#[derive(Debug, FromDeriveInput)]
#[darling(attributes(wlc), supports(struct_named, struct_unit))]
pub(crate) struct WlInput {
    ident: Ident,
    generics: Generics,
    op: u16,
}

#[proc_macro_derive(WlMsg, attributes(wlc))]
pub fn derive_wl(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    let parsed = match WlInput::from_derive_input(&input) {
        Ok(p) => p,
        Err(e) => return e.write_errors().into(),
    };

    match expand(&parsed) {
        Ok(ts) => ts.into(),
        Err(e) => e.to_compile_error().into(),
    }
}

fn expand(input: &WlInput) -> syn::Result<TokenStream> {
    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
    let ident = &input.ident;
    let op = &input.op;

    Ok(quote! {
        impl #impl_generics crate::proto::WlOpCode for #ident #ty_generics #where_clause {
            const OP_CODE: u64 = #op as u64;
        }
    })
}