mod attrs;
mod emit;
mod emit_proxy;
mod flat;
mod util;
use proc_macro::TokenStream;
use quote::quote;
use syn::{Data, parse_macro_input};
#[proc_macro_derive(Flat, attributes(flat))]
pub fn derive_flat(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as syn::DeriveInput);
if let Data::Union(ref u) = input.data {
return TokenStream::from(
syn::Error::new_spanned(u.union_token, "Flat cannot be derived for unions")
.to_compile_error(),
);
}
if let Err(err) = attrs::validate_all_attrs(&input) {
return TokenStream::from(err.to_compile_error());
}
if let Data::Enum(ref data) = input.data
&& let Some(err) = flat::validate_enum(&input, data)
{
return TokenStream::from(err);
}
let flat_impl = flat::gen_flat_impl(&input);
let emit_impl = emit::gen_emit_impl(&input);
TokenStream::from(quote! { #flat_impl #emit_impl })
}
#[proc_macro_derive(Emit, attributes(emit))]
pub fn derive_emit(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as syn::DeriveInput);
TokenStream::from(emit_proxy::gen_emit_proxy(&input))
}