diff --git a/macro/src/lib.rs b/macro/src/lib.rs index fcf2ce2..cb09811 100644 --- a/macro/src/lib.rs +++ b/macro/src/lib.rs @@ -28,25 +28,25 @@ pub fn route(attr: TokenStream, item: TokenStream) -> TokenStream { #[proc_macro_attribute] pub fn get(attr: TokenStream, item: TokenStream) -> TokenStream { - route::gen_get_route(attr, item) + route::gen_dyn_route(attr, item, "get") } #[proc_macro_attribute] pub fn post(attr: TokenStream, item: TokenStream) -> TokenStream { - route::gen_post_route(attr, item) + route::gen_dyn_route(attr, item, "post") } #[proc_macro_attribute] pub fn put(attr: TokenStream, item: TokenStream) -> TokenStream { - route::gen_put_route(attr, item) + route::gen_dyn_route(attr, item, "put") } #[proc_macro_attribute] pub fn delete(attr: TokenStream, item: TokenStream) -> TokenStream { - route::gen_delete_route(attr, item) + route::gen_dyn_route(attr, item, "delete") } #[proc_macro_attribute] pub fn option(attr: TokenStream, item: TokenStream) -> TokenStream { - route::gen_option_route(attr, item) + route::gen_dyn_route(attr, item, "option") } \ No newline at end of file diff --git a/macro/src/route.rs b/macro/src/route.rs index 310e783..41295bf 100644 --- a/macro/src/route.rs +++ b/macro/src/route.rs @@ -7,7 +7,8 @@ extern crate proc_macro; use parse::{Parse, ParseStream}; use proc_macro::{Span, TokenStream}; use punctuated::Punctuated; // 用于处理宏输入 -use quote::quote; // 用于生成代码 +use quote::quote; use spanned::Spanned; +// 用于生成代码 use syn::*; struct Args { @@ -63,97 +64,23 @@ pub fn gen_route(attr: TokenStream, item: TokenStream) -> TokenStream { expanded.into() } -pub fn gen_get_route(attr: TokenStream, item: TokenStream) -> TokenStream { +pub fn gen_dyn_route(attr: TokenStream, item: TokenStream, method: &str) -> TokenStream { let args = parse_macro_input!(attr as Args); let func = parse_macro_input!(item as ItemFn); - - let vis = func.vis.clone(); - let ident = func.sig.ident.clone(); - - let route = args.get_arg(0).unwrap(); - - let expanded = quote! { - #vis fn #ident () -> (&'static str, axum::routing::method_routing::MethodRouter) { - #func - - (#route, axum::routing::get(#ident)) - } - }; - expanded.into() -} -pub fn gen_post_route(attr: TokenStream, item: TokenStream) -> TokenStream { - let args = parse_macro_input!(attr as Args); - let func = parse_macro_input!(item as ItemFn); - let vis = func.vis.clone(); let ident = func.sig.ident.clone(); - - let route = args.get_arg(0).unwrap(); - - let expanded = quote! { - #vis fn #ident () -> (&'static str, axum::routing::method_routing::MethodRouter) { - #func - - (#route, axum::routing::post(#ident)) - } - }; - expanded.into() -} -pub fn gen_delete_route(attr: TokenStream, item: TokenStream) -> TokenStream { - let args = parse_macro_input!(attr as Args); - let func = parse_macro_input!(item as ItemFn); - - let vis = func.vis.clone(); - let ident = func.sig.ident.clone(); - let route = args.get_arg(0).unwrap(); - - let expanded = quote! { - #vis fn #ident () -> (&'static str, axum::routing::method_routing::MethodRouter) { - #func - - (#route, axum::routing::delete(#ident)) - } - }; - expanded.into() -} -pub fn gen_put_route(attr: TokenStream, item: TokenStream) -> TokenStream { - let args = parse_macro_input!(attr as Args); - let func = parse_macro_input!(item as ItemFn); - - let vis = func.vis.clone(); - let ident = func.sig.ident.clone(); - - let route = args.get_arg(0).unwrap(); - - let expanded = quote! { - #vis fn #ident () -> (&'static str, axum::routing::method_routing::MethodRouter) { - #func - - (#route, axum::routing::put(#ident)) - } - }; - expanded.into() -} + let method_name: Ident = Ident::new(method, route.span()); -pub fn gen_option_route(attr: TokenStream, item: TokenStream) -> TokenStream { - let args = parse_macro_input!(attr as Args); - let func = parse_macro_input!(item as ItemFn); - - let vis = func.vis.clone(); - let ident = func.sig.ident.clone(); - - let route = args.get_arg(0).unwrap(); - let expanded = quote! { - #vis fn #ident () -> (&'static str, axum::routing::method_routing::MethodRouter) { - #func - - (#route, axum::routing::option(#ident)) - } - }; + #vis fn #ident () -> (&'static str, axum::routing::method_routing::MethodRouter) { + #func + + (#route, axum::routing::#method_name(#ident)) + } + }; expanded.into() -} +} \ No newline at end of file