Skip to content

Commit e5e445a

Browse files
committed
fix: required parameter should not be empty
1 parent f44a7ff commit e5e445a

3 files changed

Lines changed: 52 additions & 0 deletions

File tree

src/node.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,11 @@ impl<T: fmt::Debug> Node<T> {
210210
});
211211
}
212212
} else {
213+
// if it's normal, parameter is required
214+
if k == &Kind::Normal && bytes[0] == b'/' {
215+
return None;
216+
}
217+
213218
// static
214219
if let Some(id) = self.nodes0.as_ref().and_then(|nodes| {
215220
nodes.iter().find_map(|node| match &node.key {

src/parser.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use alloc::{string::ToString, vec::Vec};
22
use core::{iter::Peekable, str::CharIndices};
33

4+
/// Types of path segments.
5+
///
6+
/// Represents the matching pattern for parameters in URL paths.
7+
/// Different kinds determine how parameters match URL path segments.
48
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
59
pub enum Kind {
610
/// `:` 58

tests/issues.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use path_tree::PathTree;
2+
3+
#[test]
4+
fn test_44() {
5+
let mut tree = PathTree::new();
6+
let _ = tree.insert("/test/:me", 0);
7+
let _ = tree.insert("/test/:me?", 1);
8+
let _ = tree.insert("/test/:me/now", 2);
9+
let _ = tree.insert("/test/:me?/now", 3);
10+
11+
let (value, path) = tree.find("/test/").unwrap();
12+
assert_eq!(value, &1);
13+
assert_eq!(path.params(), &[("me", "")]);
14+
15+
let (value, path) = tree.find("/test/now").unwrap();
16+
assert_eq!(value, &0);
17+
assert_eq!(path.params(), &[("me", "now")]);
18+
19+
// not found
20+
let result = tree.find("/test//");
21+
assert!(result.is_none());
22+
23+
let (value, path) = tree.find("/test//now").unwrap();
24+
assert_eq!(value, &3);
25+
assert_eq!(path.params(), &[("me", "")]);
26+
27+
let (value, path) = tree.find(r"/test/\/now").unwrap();
28+
assert_eq!(value, &2);
29+
assert_eq!(path.params(), &[("me", r"\")]);
30+
31+
// trim `/`
32+
let trimed = "/test//now"
33+
.split('/')
34+
.filter(|s| !s.is_empty())
35+
.collect::<Vec<_>>();
36+
let mut path = trimed.join("/");
37+
// add lead with `/`
38+
path.insert(0, '/');
39+
assert_eq!(path, "/test/now");
40+
let (value, path) = tree.find(&path).unwrap();
41+
assert_eq!(value, &0);
42+
assert_eq!(path.params(), &[("me", "now")]);
43+
}

0 commit comments

Comments
 (0)