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
#![recursion_limit = "128"] #![feature(proc_macro)] extern crate proc_macro; #[macro_use] extern crate quote; extern crate rundo_types; extern crate syn; mod literal; mod rundo_struct; use literal::LiteralMacro; use rundo_struct::RundoStruct; use proc_macro::TokenStream; #[proc_macro_attribute] pub fn rundo(args: TokenStream, input: TokenStream) -> TokenStream { let ast = syn::parse(input).expect("Well, can't parse the code, maybe some syntax error!"); impl_rundo_attrs(&ast).into() } fn impl_rundo_attrs(item: &syn::Item) -> quote::Tokens { if let &syn::Item::Struct(ref s) = item { let op_def = s.op_struct_def(); let struct_def = s.struct_def(); let impl_rundo = s.impl_rundo(); let literal_macro = s.literal_macro(); quote! { #op_def #struct_def #impl_rundo #literal_macro } } else { panic!("#[rundo] is only support for structs now!"); } }