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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
extern crate proc_macro; use proc_macro::TokenStream; use quote::ToTokens; mod cookies; mod forms; mod models; mod route; mod util; #[proc_macro_attribute] pub fn cookie(_: TokenStream, item: TokenStream) -> TokenStream { let ast = syn::parse::<syn::ItemStruct>(item).unwrap(); let cookie = cookies::cookie(&ast); let mut tokens = ast.to_token_stream(); tokens.extend(cookie); TokenStream::from(tokens) } #[proc_macro_attribute] pub fn form(meta: TokenStream, item: TokenStream) -> TokenStream { let mut ast = syn::parse::<syn::ItemStruct>(item).unwrap(); let meta = syn::parse::<forms::FormMeta>(meta).unwrap(); let display = forms::form(&meta, &mut ast); let mut tokens = ast.to_token_stream(); tokens.extend(display); TokenStream::from(tokens) } #[proc_macro_attribute] pub fn handler(meta: TokenStream, item: TokenStream) -> TokenStream { let ast = syn::parse::<syn::ItemFn>(item).unwrap(); let methods = syn::parse::<route::HandlerMethods>(meta).unwrap().methods; route::handler(&methods, ast) } #[proc_macro_attribute] pub fn get(_: TokenStream, item: TokenStream) -> TokenStream { let ast = syn::parse::<syn::ItemFn>(item).unwrap(); route::handler(&["get"], ast) } #[proc_macro_attribute] pub fn post(_: TokenStream, item: TokenStream) -> TokenStream { let ast = syn::parse::<syn::ItemFn>(item).unwrap(); route::handler(&["post"], ast) } #[proc_macro_attribute] pub fn route(_: TokenStream, item: TokenStream) -> TokenStream { let ast: syn::ItemFn = syn::parse::<syn::ItemFn>(item).unwrap(); route::route(ast, true) } #[proc_macro_attribute] pub fn scope(_: TokenStream, item: TokenStream) -> TokenStream { let ast: syn::ItemFn = syn::parse::<syn::ItemFn>(item).unwrap(); route::route(ast, false) } #[proc_macro_derive(ToField, attributes(option))] pub fn derive_to_field(item: TokenStream) -> TokenStream { let ast = syn::parse::<syn::DeriveInput>(item).unwrap(); TokenStream::from(forms::to_field(ast)) } #[proc_macro_attribute] pub fn model(_: TokenStream, item: TokenStream) -> TokenStream { let mut ast = syn::parse::<syn::ItemStruct>(item).unwrap(); let impls = models::model(&mut ast); let mut tokens = ast.to_token_stream(); tokens.extend(impls); TokenStream::from(tokens) } #[proc_macro_attribute] pub fn model_type(_: TokenStream, item: TokenStream) -> TokenStream { let mut ast = syn::parse::<syn::Item>(item).unwrap(); let impls = models::model_type(&mut ast); let mut tokens = ast.to_token_stream(); tokens.extend(impls); TokenStream::from(tokens) }