2 个版本

0.1.1 2024 年 3 月 18 日
0.1.0 2024 年 2 月 29 日

#979HTTP 服务器

Download history 127/week @ 2024-03-14 28/week @ 2024-03-21 21/week @ 2024-03-28 8/week @ 2024-04-04

每月 78 次下载

MIT 许可证

8KB
137

router

router 是一个不支持嵌套的 axum Rust 枚举路由器。

声明你的路由

use router::router;

#[router]
pub enum Route {
  #[get("/")]
  Root,
  #[get("/todos/:id/edit")]
  EditTodo(i32)
  #[put("/todos/:id")]
  UpdateTodo(i32)
}

它会抱怨缺少的函数,你仍然需要编写这些函数

async fn root() -> String {
  Route::Root.to_string() // "/"
}

async fn edit_todo(Path(id): Path<i32>) -> String {
  Route::EditTodo(id).to_string() // "/todos/:id/edit"
}

async fn update_todo(Path(id): Path<i32>) -> String {
  Route::UpdateTodo(id).to_string() // "/todos/:id"
}

使用方法如下

#[tokio::main]
async fn main() {
  let ip = "127.0.0.1:9001";
  let listener = tokio::net::TcpListener::bind(ip).await.unwrap();
  let router = Route::router();
  axum::serve(listener, router).await.unwrap();
}

获取状态?

use std::sync::Arc;
use axum::extract::State;

struct AppState {
  count: u64
}

#[router(Arc<AppState>)]
enum Routes {
  #[get("/")]
  Index
}

async fn index(State(_st): State<Arc<AppState>>) -> String {
  Routes::Index.to_string()
}

#[tokio::main]
async fn main() {
  let ip = "127.0.0.1:9001";
  let listener = tokio::net::TcpListener::bind(ip).await.unwrap();
  let router = Routes::router().with_state(Arc::new(AppState { count: 0 }));
  axum::serve(listener, router).await.unwrap();
}

依赖项

~1.5MB
~35K SLoC