Features
-
Fast: See benchmark
-
Micro: The src/lib.rs file is ~385 lines of code (Includes comments)
-
Flexible:
-
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
.
-
Benchmark
$ cargo bench
path_insert/path_tree_insert
time: [285.97 us 286.32 us 286.73 us]
Found 6 outliers among 50 measurements (12.00%)
4 (8.00%) high mild
2 (4.00%) high severe
path_insert/route_recognizer_add
time: [194.49 us 194.95 us 195.49 us]
Found 4 outliers among 50 measurements (8.00%)
1 (2.00%) high mild
3 (6.00%) high severe
path_insert/path_table_setup
time: [94.507 us 94.655 us 94.847 us]
Found 9 outliers among 50 measurements (18.00%)
3 (6.00%) high mild
6 (12.00%) high severe
path_insert/actix_router_path
time: [14.998 ms 15.013 ms 15.029 ms]
Found 8 outliers among 50 measurements (16.00%)
2 (4.00%) low mild
3 (6.00%) high mild
3 (6.00%) high severe
path_find/path_tree_find
time: [375.39 us 375.73 us 376.04 us]
Found 2 outliers among 50 measurements (4.00%)
1 (2.00%) high mild
1 (2.00%) high severe
path_find/route_recognizer_recognize
time: [1.1090 ms 1.1110 ms 1.1138 ms]
Found 4 outliers among 50 measurements (8.00%)
2 (4.00%) high mild
2 (4.00%) high severe
path_find/path_table_route
time: [158.79 us 159.96 us 161.24 us]
Found 4 outliers among 50 measurements (8.00%)
4 (8.00%) high mild
path_find/actix_router_recognize
time: [9.1690 ms 9.1891 ms 9.2135 ms]
Found 7 outliers among 50 measurements (14.00%)
3 (6.00%) high mild
4 (8.00%) high severe
Path Find
Path Insert
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!;
use Infallible;
use Future;
use Pin;
use Arc;
use ;
use ;
use PathTree;
static NOT_FOUND: & = b"Not Found";
type Params = ;
async
async
async
async
async
async
Acknowledgements
It is inspired by the:
- rax
- httprouter
- echo router
- trekjs router