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;
}
})
}