30 lines
1,000 B
Rust
30 lines
1,000 B
Rust
mod codec;
|
|
mod meta;
|
|
use proc_macro::TokenStream;
|
|
use syn::{parse_macro_input, DeriveInput};
|
|
#[proc_macro_derive(Payload, attributes(codec))]
|
|
pub fn derive_payload(input: TokenStream) -> TokenStream {
|
|
let input = parse_macro_input!(input as DeriveInput);
|
|
codec::expand_payload(&input)
|
|
.unwrap_or_else(syn::Error::into_compile_error)
|
|
.into()
|
|
}
|
|
#[proc_macro_derive(Message, attributes(codec, message))]
|
|
pub fn derive_message(input: TokenStream) -> TokenStream {
|
|
let input = parse_macro_input!(input as DeriveInput);
|
|
let payload = match codec::expand_payload(&input) {
|
|
Ok(tokens) => tokens,
|
|
Err(error) => return error.into_compile_error().into(),
|
|
};
|
|
let meta = match meta::expand_meta(&input) {
|
|
Ok(tokens) => tokens,
|
|
Err(error) => return error.into_compile_error().into(),
|
|
};
|
|
let registration = meta::expand_registration(&input);
|
|
quote::quote! {
|
|
#payload
|
|
#meta
|
|
#registration
|
|
}
|
|
.into()
|
|
}
|