3 个版本 (重大更新)

0.3.0 2024 年 7 月 24 日
0.2.0 2024 年 1 月 19 日
0.1.0 2023 年 12 月 29 日

#6 in #xitca-web

Download history 35/week @ 2024-04-26 15/week @ 2024-05-03 208/week @ 2024-05-17 101/week @ 2024-05-24 29/week @ 2024-05-31 16/week @ 2024-06-07 16/week @ 2024-06-14 27/week @ 2024-06-21 39/week @ 2024-06-28 58/week @ 2024-07-05 78/week @ 2024-07-12 213/week @ 2024-07-19 96/week @ 2024-07-26 122/week @ 2024-08-02 118/week @ 2024-08-09

每月 560 次下载
3 个 Crates 中使用 (via xitca-http)

MIT 许可证

105KB
2.5K SLoC

基于 matchit 的分支

与 matchit 比较

  • 优点
    • 具有无生命周期污染的干净公共类型。(更容易传递参数)
    • 100% 安全的 Rust。(通过依赖项仍然使用 unsafe 代码)
  • 缺点
    • 不可变路由值。
    • 在微基准测试中可能较慢。

lib.rs:

使用小字符串类型进行参数生命周期省略的基于 matchit 的分支

let mut router = xitca_router::Router::new();
router.insert("/home", "Welcome!")?;
router.insert("/users/:id", "A User")?;

let matched = router.at("/users/978")?;
assert_eq!(*matched.value, "A User");

// params is owned value that can be sent between threads.
let params = matched.params;
std::thread::spawn(move || {
    assert_eq!(params.get("id"), Some("978"));
})
.join()
.unwrap();

参数

除了静态路由外,路由器还支持动态路由段。这些可以是命名参数或通配符参数

命名参数

命名参数,如 /:id 匹配到下一个 / 或路径末尾的任何内容

let mut m = xitca_router::Router::new();
m.insert("/users/:id", true)?;

assert_eq!(m.at("/users/1")?.params.get("id"), Some("1"));
assert_eq!(m.at("/users/23")?.params.get("id"), Some("23"));
assert!(m.at("/users").is_err());

通配符参数

通配符参数以 * 开头,并匹配 / 之后的任何内容。它们必须始终位于路由的 末尾

let mut m = xitca_router::Router::new();
m.insert("/*p", true)?;

assert_eq!(m.at("/foo.js")?.params.get("p"), Some("foo.js"));
assert_eq!(m.at("/c/bar.css")?.params.get("p"), Some("c/bar.css"));

宽松的通配符参数

具有单个 * 的宽松通配符参数匹配 / 之后的任何内容(包括 / 本身)。由于没有与 Params 键关联的标识符,它们被保留为空。它们必须始终位于路由的 末尾

let mut m = xitca_router::Router::new();
m.insert("/*", true)?;

assert!(m.at("/")?.value);
assert!(m.at("/foo")?.value);

路由优先级

静态和动态路由段可以重叠。如果它们重叠,则静态段将具有更高的优先级

let mut m = xitca_router::Router::new();
m.insert("/", "Welcome!").unwrap()    ;  // priority: 1
m.insert("/about", "About Me").unwrap(); // priority: 1
m.insert("/*filepath", "...").unwrap();  // priority: 2

依赖项