File tree Expand file tree Collapse file tree 3 files changed +36
-21
lines changed Expand file tree Collapse file tree 3 files changed +36
-21
lines changed Original file line number Diff line number Diff line change @@ -168,28 +168,33 @@ impl<T> PathTree<T> {
168168 }
169169
170170 pub fn insert ( & mut self , path : & str , value : T ) -> usize {
171- if path. is_empty ( ) {
172- return self . id ;
173- }
174-
175171 let mut node = & mut self . node ;
176- let pieces = Parser :: new ( path) . collect :: < Vec < _ > > ( ) ;
177172
178- for piece in & pieces {
179- match piece {
180- Piece :: String ( s) => {
181- node = node. insert_bytes ( & s[ ..] ) ;
182- }
183- Piece :: Parameter ( _, k) => {
184- node = node. insert_parameter ( * k) ;
173+ let ( overwritten, pieces) = if path. is_empty ( ) {
174+ ( false , Vec :: new ( ) )
175+ } else {
176+ let pieces = Parser :: new ( path) . collect :: < Vec < _ > > ( ) ;
177+ for piece in & pieces {
178+ match piece {
179+ Piece :: String ( s) => {
180+ node = node. insert_bytes ( & s[ ..] ) ;
181+ }
182+ Piece :: Parameter ( _, k) => {
183+ node = node. insert_parameter ( * k) ;
184+ }
185185 }
186186 }
187- }
187+ ( true , pieces)
188+ } ;
188189
189- self . routes . push ( ( value, pieces) ) ;
190190 if let Some ( id) = node. value {
191+ self . routes [ id] . 0 = value;
192+ if overwritten {
193+ self . routes [ id] . 1 = pieces;
194+ }
191195 id
192196 } else {
197+ self . routes . push ( ( value, pieces) ) ;
193198 let id = self . id ;
194199 node. value = Some ( id) ;
195200 self . id += 1 ;
Original file line number Diff line number Diff line change @@ -35,13 +35,13 @@ impl<T: fmt::Debug> Node<T> {
3535
3636 pub fn insert_bytes ( & mut self , mut bytes : & [ u8 ] ) -> & mut Self {
3737 let diff = match & mut self . kind {
38- NodeKind :: String ( p ) => {
39- if p . is_empty ( ) {
40- * p = bytes. to_vec ( ) ;
38+ NodeKind :: String ( s ) => {
39+ if s . is_empty ( ) {
40+ * s = bytes. to_vec ( ) ;
4141 return self ;
4242 }
4343
44- let cursor = p
44+ let cursor = s
4545 . iter ( )
4646 . zip ( bytes. iter ( ) )
4747 . take_while ( |( a, b) | a == b)
@@ -51,10 +51,10 @@ impl<T: fmt::Debug> Node<T> {
5151 true
5252 } else {
5353 // split node
54- if cursor < p . len ( ) {
55- let ( prefix, suffix) = p . split_at ( cursor) ;
54+ if cursor < s . len ( ) {
55+ let ( prefix, suffix) = s . split_at ( cursor) ;
5656 let mut node = Node :: new ( NodeKind :: String ( prefix. to_vec ( ) ) , None ) ;
57- * p = suffix. to_vec ( ) ;
57+ * s = suffix. to_vec ( ) ;
5858 :: std:: mem:: swap ( self , & mut node) ;
5959 self . nodes0 . get_or_insert_with ( Vec :: new) . push ( node) ;
6060 }
Original file line number Diff line number Diff line change @@ -1693,6 +1693,16 @@ fn basic() {
16931693 assert_eq ! ( r. value, & 0 ) ;
16941694 assert_eq ! ( r. params( ) , vec![ ] ) ;
16951695
1696+ tree. insert ( "" , 14 ) ;
1697+ let r = tree. find ( "/" ) . unwrap ( ) ;
1698+ assert_eq ! ( r. value, & 14 ) ;
1699+ assert_eq ! ( r. params( ) , vec![ ] ) ;
1700+
1701+ tree. insert ( "/" , 15 ) ;
1702+ let r = tree. find ( "/" ) . unwrap ( ) ;
1703+ assert_eq ! ( r. value, & 15 ) ;
1704+ assert_eq ! ( r. params( ) , vec![ ] ) ;
1705+
16961706 let r = tree. find ( "/login" ) . unwrap ( ) ;
16971707 assert_eq ! ( r. value, & 1 ) ;
16981708 assert_eq ! ( r. params( ) , vec![ ] ) ;
You can’t perform that action at this time.
0 commit comments