Skip to content

Commit 1fc018c

Browse files
committed
chore: allow insert empty str
1 parent 7663b31 commit 1fc018c

File tree

3 files changed

+36
-21
lines changed

3 files changed

+36
-21
lines changed

src/lib.rs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff 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;

src/node.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff 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
}

tests/tree.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff 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![]);

0 commit comments

Comments
 (0)