添加路由生成的下一步计划
This commit is contained in:
parent
2c48ee6537
commit
1a39728d3e
@ -4,7 +4,10 @@
|
|||||||
- [*] 参考example中的jwt实现方式,移除context对extension的依赖?那么language-tag该怎么处理?
|
- [*] 参考example中的jwt实现方式,移除context对extension的依赖?那么language-tag该怎么处理?
|
||||||
- [ ] 参考rocket,移除参数的元组类型
|
- [ ] 参考rocket,移除参数的元组类型
|
||||||
- [ ] 模拟request_util能否避免涉及到的parts.clone()?
|
- [ ] 模拟request_util能否避免涉及到的parts.clone()?
|
||||||
- [ ] 能否自定义实现宏路由
|
- [-] 能否自定义实现宏路由
|
||||||
|
- [*] 定向路由的实现
|
||||||
|
- [ ] 支持多种method的路由
|
||||||
|
- [ ] 宏路由支持fallback等
|
||||||
|
|
||||||
|
|
||||||
### note
|
### note
|
||||||
|
@ -10,7 +10,7 @@ use syn::{parse_macro_input, DeriveInput}; // 用于解析宏输入
|
|||||||
mod responsable;
|
mod responsable;
|
||||||
mod route;
|
mod route;
|
||||||
|
|
||||||
// 定义一个名为`responsable`的过程宏
|
/// `Responsable`的过程宏,将结构体实现`IntoResponse` trait
|
||||||
// #[proc_macro_derive(Responsable, attributes(status, headers))]
|
// #[proc_macro_derive(Responsable, attributes(status, headers))]
|
||||||
#[proc_macro_derive(Responsable)]
|
#[proc_macro_derive(Responsable)]
|
||||||
pub fn responsable(input: TokenStream) -> TokenStream {
|
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")
|
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]
|
#[proc_macro_attribute]
|
||||||
pub fn delete(attr: TokenStream, item: TokenStream) -> TokenStream {
|
pub fn delete(attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||||
route::gen_dyn_route(attr, item, "delete")
|
route::gen_dyn_route(attr, item, "delete")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn option(attr: TokenStream, item: TokenStream) -> TokenStream {
|
pub fn options(attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||||
route::gen_dyn_route(attr, item, "option")
|
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 {
|
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) {
|
match self.vars.get(index) {
|
||||||
Some(var) => Ok(var.clone()),
|
Some(var) => Ok(Some(var.clone())),
|
||||||
None => return Err(syn::Error::new(
|
None => {
|
||||||
Span::call_site().into(),
|
// 第一个参数使路由url,必须存在,其他的参数根据实际需求进一步解析
|
||||||
"route must have one argument"
|
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()
|
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 {
|
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);
|
||||||
@ -71,7 +85,7 @@ pub fn gen_dyn_route(attr: TokenStream, item: TokenStream, method: &str) -> Toke
|
|||||||
let vis = func.vis.clone();
|
let vis = func.vis.clone();
|
||||||
let ident = func.sig.ident.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());
|
let method_name: Ident = Ident::new(method, route.span());
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ pub async fn get_feedback_list_by_page(
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/feedback/:page/:pageSize")]
|
#[get("/feedback/:page/:pageSize", d = "a")]
|
||||||
pub async fn get_feedback_list(
|
pub async fn get_feedback_list(
|
||||||
context: Context,
|
context: Context,
|
||||||
PathVar(page_params): PathVar<PageParams>,
|
PathVar(page_params): PathVar<PageParams>,
|
||||||
|
Loading…
Reference in New Issue
Block a user