@@ -4,23 +4,37 @@ use pyo3::prelude::*;
4
4
#[ pyclass( module = "routrie._routrie" ) ]
5
5
struct Router {
6
6
router : PathTree < Py < PyAny > > ,
7
+ // path-tree dropped support for empty values
8
+ // so we implement it here as a special case
9
+ empty : Option < Py < PyAny > > ,
7
10
}
8
11
12
+ type MatchedRoute < ' a > = ( & ' a Py < PyAny > , Vec < ( & ' a str , & ' a str ) > ) ;
13
+
9
14
#[ pymethods]
10
15
impl Router {
11
16
#[ new]
12
17
fn new ( ) -> Self {
13
18
Router {
14
19
router : PathTree :: new ( ) ,
20
+ empty : None ,
15
21
}
16
22
}
17
- fn insert ( & mut self , path : & str , data : & PyAny , py : Python ) -> ( ) {
18
- self . router . insert ( path, data. into_py ( py) ) ;
23
+ fn insert ( & mut self , path : & str , data : & PyAny , py : Python ) {
24
+ match path. is_empty ( ) {
25
+ true => self . empty = Some ( data. into ( ) ) ,
26
+ false => {
27
+ self . router . insert ( path, data. into_py ( py) ) ;
28
+ }
29
+ }
19
30
}
20
- fn find < ' m > ( & ' m self , path : & ' m str ) -> Option < ( & ' m Py < PyAny > , Vec < ( & ' m str , & ' m str ) > ) > {
21
- match self . router . find ( path) {
22
- None => None ,
23
- Some ( path) => Some ( ( path. value , path. params ( ) ) ) ,
31
+ fn find < ' a > ( & ' a self , path : & ' a str ) -> Option < MatchedRoute < ' a > > {
32
+ match path. is_empty ( ) {
33
+ true => self . empty . as_ref ( ) . map ( |v| ( v, vec ! [ ] ) ) ,
34
+ false => match self . router . find ( path) {
35
+ None => None ,
36
+ Some ( path) => Some ( ( path. value , path. params ( ) ) ) ,
37
+ } ,
24
38
}
25
39
}
26
40
}
0 commit comments