extern crate darling;
extern crate proc_macro;
use darling::util::SpannedValue;
use darling::{ast, Error, FromDeriveInput, FromField};
use syn::{parse_macro_input, DeriveInput};
mod de;
mod ser;
#[derive(Debug, FromDeriveInput)]
struct MyTraitReceiver {
ident: syn::Ident,
generics: syn::Generics,
data: ast::Data<(), MyFieldReceiver>,
}
#[derive(Debug, FromField)]
#[darling(attributes(zusi))]
struct MyFieldReceiver {
ident: Option<syn::Ident>,
#[darling(default)]
id: SpannedValue<Option<u16>>,
}
#[proc_macro_derive(Serialize, attributes(zusi))]
pub fn serialize_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
let receiver = MyTraitReceiver::from_derive_input(&ast).unwrap();
let mut errors: Vec<Error> = Vec::new();
let mut gen = ser::impl_serialize(&mut errors, &receiver);
if !errors.is_empty() {
gen.extend(Error::multiple(errors).write_errors());
}
gen.into()
}
#[proc_macro_derive(Deserialize, attributes(zusi))]
pub fn deserialize_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
let receiver = MyTraitReceiver::from_derive_input(&ast).unwrap();
let mut errors: Vec<Error> = Vec::new();
let mut gen = de::impl_deserialize(&mut errors, &receiver);
if !errors.is_empty() {
gen.extend(Error::multiple(errors).write_errors());
}
gen.into()
}