缩减宏路由代码

This commit is contained in:
李运家 2024-10-03 11:34:12 +08:00
parent e9fd606dbd
commit 8a28c0e577
2 changed files with 16 additions and 89 deletions

View File

@ -28,25 +28,25 @@ pub fn route(attr: TokenStream, item: TokenStream) -> TokenStream {
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn get(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn get(attr: TokenStream, item: TokenStream) -> TokenStream {
route::gen_get_route(attr, item) route::gen_dyn_route(attr, item, "get")
} }
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn post(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn post(attr: TokenStream, item: TokenStream) -> TokenStream {
route::gen_post_route(attr, item) route::gen_dyn_route(attr, item, "post")
} }
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn put(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn put(attr: TokenStream, item: TokenStream) -> TokenStream {
route::gen_put_route(attr, item) route::gen_dyn_route(attr, item, "put")
} }
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn delete(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn delete(attr: TokenStream, item: TokenStream) -> TokenStream {
route::gen_delete_route(attr, item) route::gen_dyn_route(attr, item, "delete")
} }
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn option(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn option(attr: TokenStream, item: TokenStream) -> TokenStream {
route::gen_option_route(attr, item) route::gen_dyn_route(attr, item, "option")
} }

View File

@ -7,7 +7,8 @@ extern crate proc_macro;
use parse::{Parse, ParseStream}; use parse::{Parse, ParseStream};
use proc_macro::{Span, TokenStream}; use punctuated::Punctuated; use proc_macro::{Span, TokenStream}; use punctuated::Punctuated;
// 用于处理宏输入 // 用于处理宏输入
use quote::quote; // 用于生成代码 use quote::quote; use spanned::Spanned;
// 用于生成代码
use syn::*; use syn::*;
struct Args { struct Args {
@ -63,7 +64,7 @@ pub fn gen_route(attr: TokenStream, item: TokenStream) -> TokenStream {
expanded.into() 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 args = parse_macro_input!(attr as Args);
let func = parse_macro_input!(item as ItemFn); let func = parse_macro_input!(item as ItemFn);
@ -72,87 +73,13 @@ pub fn gen_get_route(attr: TokenStream, item: TokenStream) -> TokenStream {
let route = args.get_arg(0).unwrap(); let route = args.get_arg(0).unwrap();
let expanded = quote! { let method_name: Ident = Ident::new(method, route.span());
#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! { let expanded = quote! {
#vis fn #ident () -> (&'static str, axum::routing::method_routing::MethodRouter) { #vis fn #ident () -> (&'static str, axum::routing::method_routing::MethodRouter) {
#func #func
(#route, axum::routing::post(#ident)) (#route, axum::routing::#method_name(#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()
}
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))
} }
}; };
expanded.into() expanded.into()