#routes #axum #named #path #router #name #routing

axum-named-routes

Axum 路由器,允许对路由进行命名

5 个版本

0.2.3 2023 年 9 月 30 日
0.2.2 2023 年 1 月 6 日
0.2.1 2022 年 12 月 31 日
0.2.0 2022 年 12 月 2 日
0.1.0 2022 年 8 月 15 日

#23 in #named

MIT 许可证

18KB
301 行代码(不包括注释)

Axum Named Routes

axum-named-routes 是一个库,允许用户在 axum 中轻松定义带有名称的路由,并在运行时从路由名称获取路由路径。

Crates.io Documentation

安全性

  • 使用 100% 安全的 Rust,并使用 #![forbid(unsafe_code)] 禁用不安全代码

使用示例

use std::{net::SocketAddr, path::PathBuf};
use axum::routing::get;
use axum_named_routes::{NamedRouter, Routes};

async fn index() -> &'static str {
    "Hello, World!"
}

// gets the routes from axum extensions
async fn nested_other(routes: Routes) {
    // this could panic if the name is not in the Routes map
    // but we know that it is because we got here
    let this_route = routes.has("ui.other");
    assert_eq!(this_route, &PathBuf::from("/ui/other"));
}

async fn other(routes: Routes) {
    // the get function does not panic rather it returns an Option
    let route = routes.get("ui.other");
    let this_route = routes.get("other");
    assert_ne!(route, this_route);
}

#[tokio::main]
async fn main() {
    let ui = NamedRouter::new()
        .route("index", "/", get(index))
        .route("other", "/other", get(nested_other));
    let app = NamedRouter::new()
        .nest("ui", "/ui/", ui)
        .route("other", "/other", get(other));

    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

示例可以在 examples/simple.rs 中找到。

性能

该路由器在创建映射时内部使用 HashMap,并在完成后将其包装在 Arc 中作为 axum 扩展添加。因此,整体性能成本应该非常低。

许可证

该项目根据 MIT 许可证 许可。

依赖关系

~6–15MB
~187K SLoC