1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#![recursion_limit = "256"] extern crate proc_macro; mod parse; mod tagged_impl; mod tagged_trait; use crate::parse::{ImplArgs, Input, TraitArgs}; use proc_macro::TokenStream; use syn::parse_macro_input; #[derive(Copy, Clone)] pub(crate) struct Mode { ser: bool, de: bool, } #[proc_macro_attribute] pub fn serde(args: TokenStream, input: TokenStream) -> TokenStream { let ser = true; let de = true; expand(args, input, Mode { ser, de }) } #[proc_macro_attribute] pub fn serialize(args: TokenStream, input: TokenStream) -> TokenStream { let ser = true; let de = false; expand(args, input, Mode { ser, de }) } #[proc_macro_attribute] pub fn deserialize(args: TokenStream, input: TokenStream) -> TokenStream { let ser = false; let de = true; expand(args, input, Mode { ser, de }) } fn expand(args: TokenStream, input: TokenStream, mode: Mode) -> TokenStream { let input = parse_macro_input!(input as Input); TokenStream::from(match input { Input::Trait(input) => { let args = parse_macro_input!(args as TraitArgs); tagged_trait::expand(args, input, mode) } Input::Impl(input) => { let args = parse_macro_input!(args as ImplArgs); tagged_impl::expand(args, input, mode) } }) }