57
57
//! tree.insert("/:org/:repo/*", 12);
58
58
//! tree.insert("/api/+", 13);
59
59
//!
60
- //! let r = tree.find("/").unwrap();
61
- //! assert_eq!(r.value , &0);
62
- //! assert_eq!(r .params(), vec![]);
60
+ //! let (h, p) = tree.find("/").unwrap();
61
+ //! assert_eq!(h , &0);
62
+ //! assert_eq!(p .params(), vec![]);
63
63
//!
64
- //! let r = tree.find("/login").unwrap();
65
- //! assert_eq!(r.value , &1);
66
- //! assert_eq!(r .params(), vec![]);
64
+ //! let (h, p) = tree.find("/login").unwrap();
65
+ //! assert_eq!(h , &1);
66
+ //! assert_eq!(p .params(), vec![]);
67
67
//!
68
- //! let r = tree.find("/settings/admin").unwrap();
69
- //! assert_eq!(r.value , &4);
70
- //! assert_eq!(r .params(), vec![("page", "admin")]);
68
+ //! let (h, p) = tree.find("/settings/admin").unwrap();
69
+ //! assert_eq!(h , &4);
70
+ //! assert_eq!(p .params(), vec![("page", "admin")]);
71
71
//!
72
- //! let r = tree.find("/viz-rs").unwrap();
73
- //! assert_eq!(r.value , &5);
74
- //! assert_eq!(r .params(), vec![("user", "viz-rs")]);
72
+ //! let (h, p) = tree.find("/viz-rs").unwrap();
73
+ //! assert_eq!(h , &5);
74
+ //! assert_eq!(p .params(), vec![("user", "viz-rs")]);
75
75
//!
76
- //! let r = tree.find("/viz-rs/path-tree").unwrap();
77
- //! assert_eq!(r.value , &6);
78
- //! assert_eq!(r .params(), vec![("user", "viz-rs"), ("repo", "path-tree")]);
76
+ //! let (h, p) = tree.find("/viz-rs/path-tree").unwrap();
77
+ //! assert_eq!(h , &6);
78
+ //! assert_eq!(p .params(), vec![("user", "viz-rs"), ("repo", "path-tree")]);
79
79
//!
80
- //! let r = tree.find("/rust-lang/rust-analyzer/releases/download/2022-09-12/rust-analyzer-aarch64-apple-darwin.gz").unwrap();
81
- //! assert_eq!(r.value , &8);
80
+ //! let (h, p) = tree.find("/rust-lang/rust-analyzer/releases/download/2022-09-12/rust-analyzer-aarch64-apple-darwin.gz").unwrap();
81
+ //! assert_eq!(h , &8);
82
82
//! assert_eq!(
83
- //! r .params(),
83
+ //! p .params(),
84
84
//! vec![
85
85
//! ("org", "rust-lang"),
86
86
//! ("repo", "rust-analyzer"),
90
90
//! ]
91
91
//! );
92
92
//!
93
- //! let r = tree.find("/rust-lang/rust-analyzer/tags/2022-09-12").unwrap();
94
- //! assert_eq!(r.value , &9);
93
+ //! let (h, p) = tree.find("/rust-lang/rust-analyzer/tags/2022-09-12").unwrap();
94
+ //! assert_eq!(h , &9);
95
95
//! assert_eq!(
96
- //! r .params(),
96
+ //! p .params(),
97
97
//! vec![
98
98
//! ("org", "rust-lang"),
99
99
//! ("repo", "rust-analyzer"),
103
103
//! ]
104
104
//! );
105
105
//!
106
- //! let r = tree.find("/rust-lang/rust-analyzer/actions/ci:bench").unwrap();
107
- //! assert_eq!(r.value , &10);
106
+ //! let (h, p) = tree.find("/rust-lang/rust-analyzer/actions/ci:bench").unwrap();
107
+ //! assert_eq!(h , &10);
108
108
//! assert_eq!(
109
- //! r .params(),
109
+ //! p .params(),
110
110
//! vec![
111
111
//! ("org", "rust-lang"),
112
112
//! ("repo", "rust-analyzer"),
115
115
//! ]
116
116
//! );
117
117
//!
118
- //! let r = tree.find("/rust-lang/rust-analyzer/stargazers").unwrap();
119
- //! assert_eq!(r.value , &11);
120
- //! assert_eq!(r .params(), vec![("org", "rust-lang"), ("repo", "rust-analyzer"), ("page", "stargazers")]);
118
+ //! let (h, p) = tree.find("/rust-lang/rust-analyzer/stargazers").unwrap();
119
+ //! assert_eq!(h , &11);
120
+ //! assert_eq!(p .params(), vec![("org", "rust-lang"), ("repo", "rust-analyzer"), ("page", "stargazers")]);
121
121
//!
122
- //! let r = tree.find("/rust-lang/rust-analyzer/stargazers/404").unwrap();
123
- //! assert_eq!(r.value , &12);
124
- //! assert_eq!(r .params(), vec![("org", "rust-lang"), ("repo", "rust-analyzer"), ("*1", "stargazers/404")]);
122
+ //! let (h, p) = tree.find("/rust-lang/rust-analyzer/stargazers/404").unwrap();
123
+ //! assert_eq!(h , &12);
124
+ //! assert_eq!(p .params(), vec![("org", "rust-lang"), ("repo", "rust-analyzer"), ("*1", "stargazers/404")]);
125
125
//!
126
- //! let r = tree.find("/public/js/main.js").unwrap();
127
- //! assert_eq!(r.value , &7);
128
- //! assert_eq!(r .params(), vec![("any", "js/main.js")]);
126
+ //! let (h, p) = tree.find("/public/js/main.js").unwrap();
127
+ //! assert_eq!(h , &7);
128
+ //! assert_eq!(p .params(), vec![("any", "js/main.js")]);
129
129
//!
130
- //! let r = tree.find("/api/v1").unwrap();
131
- //! assert_eq!(r.value , &13);
132
- //! assert_eq!(r .params(), vec![("+1", "v1")]);
130
+ //! let (h, p) = tree.find("/api/v1").unwrap();
131
+ //! assert_eq!(h , &13);
132
+ //! assert_eq!(p .params(), vec![("+1", "v1")]);
133
133
//! ```
134
134
135
135
#![ no_std]
@@ -142,12 +142,7 @@ use alloc::{
142
142
string:: { String , ToString } ,
143
143
vec:: Vec ,
144
144
} ;
145
- use core:: {
146
- iter:: { Copied , FilterMap , Zip } ,
147
- marker:: PhantomData ,
148
- slice:: Iter ,
149
- str:: from_utf8,
150
- } ;
145
+ use core:: str:: from_utf8;
151
146
152
147
use smallvec:: SmallVec ;
153
148
@@ -212,21 +207,23 @@ impl<T> PathTree<T> {
212
207
}
213
208
214
209
/// Returns the [Path] by the given path.
215
- pub fn find < ' b > ( & self , path : & ' b str ) -> Option < Path < ' _ , ' b , T > > {
210
+ pub fn find < ' a , ' b > ( & ' a self , path : & ' b str ) -> Option < ( & T , Path < ' a , ' b > ) > {
216
211
let bytes = path. as_bytes ( ) ;
217
212
self . node . find ( bytes) . and_then ( |( id, ranges) | {
218
213
self . get_route ( * id) . map ( |( value, pieces) | {
219
- Path {
220
- id,
214
+ (
221
215
value,
222
- pieces,
223
- // opt!
224
- raws : ranges
225
- . into_iter ( )
226
- . filter_map ( |r| from_utf8 ( & bytes[ r] ) . ok ( ) )
227
- . rev ( )
228
- . collect ( ) ,
229
- }
216
+ Path {
217
+ id,
218
+ pieces,
219
+ // opt!
220
+ raws : ranges
221
+ . into_iter ( )
222
+ . filter_map ( |r| from_utf8 ( & bytes[ r] ) . ok ( ) )
223
+ . rev ( )
224
+ . collect ( ) ,
225
+ } ,
226
+ )
230
227
} )
231
228
} )
232
229
}
@@ -260,15 +257,14 @@ impl<T> PathTree<T> {
260
257
}
261
258
262
259
/// Matched route path infomation.
263
- #[ derive( Debug , PartialEq , Eq ) ]
264
- pub struct Path < ' a , ' b , T > {
260
+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
261
+ pub struct Path < ' a , ' b > {
265
262
pub id : & ' a usize ,
266
- pub value : & ' a T ,
267
263
pub pieces : & ' a [ Piece ] ,
268
264
pub raws : SmallVec < [ & ' b str ; 4 ] > ,
269
265
}
270
266
271
- impl < ' a , ' b , T > Path < ' a , ' b , T > {
267
+ impl < ' a , ' b > Path < ' a , ' b > {
272
268
/// Gets current path pattern.
273
269
pub fn pattern ( & self ) -> String {
274
270
let mut bytes = Vec :: new ( ) ;
@@ -312,14 +308,14 @@ impl<'a, 'b, T> Path<'a, 'b, T> {
312
308
}
313
309
314
310
/// Returns the parameters of the current path.
315
- pub fn params ( & self ) -> Vec < ( & ' a str , & ' b str ) > {
311
+ pub fn params ( & self ) -> Vec < ( & str , & str ) > {
316
312
self . params_iter ( ) . collect ( )
317
313
}
318
314
319
315
/// Returns the parameters iterator of the current path.
320
- pub fn params_iter < ' p > ( & ' p self ) -> ParamsIter < ' p , ' a , ' b , T > {
316
+ pub fn params_iter ( & self ) -> impl Iterator < Item = ( & str , & str ) > {
321
317
#[ inline]
322
- fn piece_filter ( piece : & Piece ) -> Option < & ' _ str > {
318
+ fn piece_filter ( piece : & Piece ) -> Option < & str > {
323
319
match piece {
324
320
Piece :: String ( _) => None ,
325
321
Piece :: Parameter ( p, _) => from_utf8 ( match p {
@@ -329,30 +325,9 @@ impl<'a, 'b, T> Path<'a, 'b, T> {
329
325
}
330
326
}
331
327
332
- ParamsIter {
333
- iter : self
334
- . pieces
335
- . iter ( )
336
- . filter_map ( piece_filter as fn ( piece : & ' a Piece ) -> Option < & ' a str > )
337
- . zip ( self . raws . iter ( ) . copied ( ) ) ,
338
- _t : PhantomData ,
339
- }
340
- }
341
- }
342
-
343
- type FilterIter < ' a > = FilterMap < Iter < ' a , Piece > , fn ( piece : & ' a Piece ) -> Option < & ' a str > > ;
344
-
345
- /// A Parameters Iterator.
346
- pub struct ParamsIter < ' p , ' a , ' b , T > {
347
- iter : Zip < FilterIter < ' a > , Copied < Iter < ' p , & ' b str > > > ,
348
- _t : PhantomData < T > ,
349
- }
350
-
351
- impl < ' p , ' a , ' b , T > Iterator for ParamsIter < ' p , ' a , ' b , T > {
352
- type Item = ( & ' a str , & ' b str ) ;
353
-
354
- #[ inline]
355
- fn next ( & mut self ) -> Option < Self :: Item > {
356
- self . iter . next ( )
328
+ self . pieces
329
+ . iter ( )
330
+ . filter_map ( piece_filter)
331
+ . zip ( self . raws . iter ( ) . copied ( ) )
357
332
}
358
333
}
0 commit comments