缩减宏路由代码

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]
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")
}

View File

@ -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()
}
}