diff --git a/README.MD b/README.MD index 729a8e7..16c7f98 100644 --- a/README.MD +++ b/README.MD @@ -4,7 +4,10 @@ - [*] 参考example中的jwt实现方式,移除context对extension的依赖?那么language-tag该怎么处理? - [ ] 参考rocket,移除参数的元组类型 - [ ] 模拟request_util能否避免涉及到的parts.clone()? -- [ ] 能否自定义实现宏路由 +- [-] 能否自定义实现宏路由 + - [*] 定向路由的实现 + - [ ] 支持多种method的路由 + - [ ] 宏路由支持fallback等 ### note diff --git a/macro/src/lib.rs b/macro/src/lib.rs index cb09811..01c2435 100644 --- a/macro/src/lib.rs +++ b/macro/src/lib.rs @@ -10,7 +10,7 @@ use syn::{parse_macro_input, DeriveInput}; // 用于解析宏输入 mod responsable; mod route; -// 定义一个名为`responsable`的过程宏 +/// `Responsable`的过程宏,将结构体实现`IntoResponse` trait // #[proc_macro_derive(Responsable, attributes(status, headers))] #[proc_macro_derive(Responsable)] pub fn responsable(input: TokenStream) -> TokenStream { @@ -41,12 +41,27 @@ pub fn put(attr: TokenStream, item: TokenStream) -> TokenStream { route::gen_dyn_route(attr, item, "put") } +#[proc_macro_attribute] +pub fn patch(attr: TokenStream, item: TokenStream) -> TokenStream { + route::gen_dyn_route(attr, item, "patch") +} + #[proc_macro_attribute] pub fn delete(attr: TokenStream, item: TokenStream) -> TokenStream { route::gen_dyn_route(attr, item, "delete") } #[proc_macro_attribute] -pub fn option(attr: TokenStream, item: TokenStream) -> TokenStream { - route::gen_dyn_route(attr, item, "option") +pub fn options(attr: TokenStream, item: TokenStream) -> TokenStream { + route::gen_dyn_route(attr, item, "options") +} + +#[proc_macro_attribute] +pub fn head(attr: TokenStream, item: TokenStream) -> TokenStream { + route::gen_dyn_route(attr, item, "head") +} + +#[proc_macro_attribute] +pub fn trace(attr: TokenStream, item: TokenStream) -> TokenStream { + route::gen_dyn_route(attr, item, "trace") } \ No newline at end of file diff --git a/macro/src/route.rs b/macro/src/route.rs index 9a2ff3e..416be39 100644 --- a/macro/src/route.rs +++ b/macro/src/route.rs @@ -26,13 +26,20 @@ impl Parse for Args { } impl Args { - pub fn get_arg(&self, index: usize) -> syn::Result { + pub fn get_arg(&self, index: usize) -> syn::Result> { match self.vars.get(index) { - Some(var) => Ok(var.clone()), - None => return Err(syn::Error::new( - Span::call_site().into(), - "route must have one argument" - )) + Some(var) => Ok(Some(var.clone())), + None => { + // 第一个参数使路由url,必须存在,其他的参数根据实际需求进一步解析 + if index != 0 { + return Ok(None) + } else { + return Err(syn::Error::new( + Span::call_site().into(), + "route must have one argument" + )) + } + } } } } @@ -64,6 +71,13 @@ pub fn gen_route(attr: TokenStream, item: TokenStream) -> TokenStream { expanded.into() } +/// todo +/// +/// 计划采用 +/// ```#[route("path"), methods = [Get, Post]]``` +/// 的形式进行完善,使方法支持多种网络请求 +/// +/// gen_dyn_route 生成的代码不再是的单独的MethodRouter,而是MethodRouter集合 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); @@ -71,7 +85,7 @@ pub fn gen_dyn_route(attr: TokenStream, item: TokenStream, method: &str) -> Toke let vis = func.vis.clone(); let ident = func.sig.ident.clone(); - let route = args.get_arg(0).unwrap(); + let route = args.get_arg(0).unwrap().unwrap(); let method_name: Ident = Ident::new(method, route.span()); diff --git a/server/src/controller/feedback_controller.rs b/server/src/controller/feedback_controller.rs index 8652052..bec9473 100644 --- a/server/src/controller/feedback_controller.rs +++ b/server/src/controller/feedback_controller.rs @@ -35,7 +35,7 @@ pub async fn get_feedback_list_by_page( .await } -#[get("/feedback/:page/:pageSize")] +#[get("/feedback/:page/:pageSize", d = "a")] pub async fn get_feedback_list( context: Context, PathVar(page_params): PathVar,