添加路由生成的下一步计划
This commit is contained in:
parent
2c48ee6537
commit
1a39728d3e
@ -4,7 +4,10 @@
|
||||
- [*] 参考example中的jwt实现方式,移除context对extension的依赖?那么language-tag该怎么处理?
|
||||
- [ ] 参考rocket,移除参数的元组类型
|
||||
- [ ] 模拟request_util能否避免涉及到的parts.clone()?
|
||||
- [ ] 能否自定义实现宏路由
|
||||
- [-] 能否自定义实现宏路由
|
||||
- [*] 定向路由的实现
|
||||
- [ ] 支持多种method的路由
|
||||
- [ ] 宏路由支持fallback等
|
||||
|
||||
|
||||
### note
|
||||
|
@ -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")
|
||||
}
|
@ -26,13 +26,20 @@ 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(
|
||||
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());
|
||||
|
||||
|
@ -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>,
|
||||
|
Loading…
Reference in New Issue
Block a user