添加路由生成的下一步计划

This commit is contained in:
李运家 2024-10-03 15:49:45 +08:00
parent 2c48ee6537
commit 1a39728d3e
4 changed files with 44 additions and 12 deletions

View File

@ -4,7 +4,10 @@
- [*] 参考example中的jwt实现方式移除context对extension的依赖那么language-tag该怎么处理
- [ ] 参考rocket移除参数的元组类型
- [ ] 模拟request_util能否避免涉及到的parts.clone()?
- [ ] 能否自定义实现宏路由
- [-] 能否自定义实现宏路由
- [*] 定向路由的实现
- [ ] 支持多种method的路由
- [ ] 宏路由支持fallback等
### note

View File

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

View File

@ -26,15 +26,22 @@ impl Parse for Args {
}
impl Args {
pub fn get_arg(&self, index: usize) -> syn::Result<syn::Expr> {
pub fn get_arg(&self, index: usize) -> syn::Result<Option<syn::Expr>> {
match self.vars.get(index) {
Some(var) => Ok(var.clone()),
None => return Err(syn::Error::new(
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"
))
}
}
}
}
}
#[allow(dead_code)]
@ -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());

View File

@ -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<PageParams>,