Features
-
Fast: See benchmark
-
Micro: The src/lib.rs file is ~396 lines of code (Includes comments)
-
Flexible:
-
Static segment. e.g.
/users
. -
Named parameters. e.g.
:name
. -
Catch-All parameters. e.g.
*any
, it must always be at the end of the pattern. -
Supports multiple naming for the same path segment. e.g.
/users/:id
and/users/:user_id/repos
. -
Don't care about routes orders, recursive lookup,
Static
->Named
->Catch-All
.
-
Examples
use PathTree;
let mut tree = new;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
tree.insert;
// Matched "/"
let node = tree.find;
assert_eq!;
let res = node.unwrap;
assert_eq!;
assert_eq!; // Params
// Matched "/:username"
let node = tree.find;
assert_eq!;
let res = node.unwrap;
assert_eq!;
assert_eq!; // Params
// Matched "/*any"
let node = tree.find;
let res = node.unwrap;
assert_eq!;
assert_eq!;
// Matched "/users/:id"
let node = tree.find;
let res = node.unwrap;
assert_eq!;
assert_eq!; // Params
// Matched "/users/:user_id/repos/:id"
let node = tree.find;
let res = node.unwrap;
assert_eq!;
assert_eq!; // Params
// Matched "/users/:user_id/repos/:id/*any"
let node = tree.find;
let res = node.unwrap;
assert_eq!;
assert_eq!; // Params
// Matched "/users/repos/*any"
let node = tree.find;
let res = node.unwrap;
assert_eq!;
assert_eq!;
Benchmark
$ cargo bench
Acknowledgements
It is inspired by the:
- rax
- httprouter
- echo router
- trekjs router