Skip to content

Commit 5d8f885

Browse files
authored
Merge pull request #23 from viz-rs/insert_returns_id
feat: insert returns node id
2 parents a528036 + 111e4ba commit 5d8f885

File tree

3 files changed

+58
-48
lines changed

3 files changed

+58
-48
lines changed

README.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,20 @@ use path_tree::PathTree;
9292
*/
9393
let mut tree = PathTree::new();
9494

95-
tree.insert("/", 0)
96-
.insert("/login", 1)
97-
.insert("/signup", 2)
98-
.insert("/settings", 3)
99-
.insert("/settings/:page", 4)
100-
.insert("/:user", 5)
101-
.insert("/:user/:repo", 6)
102-
.insert("/public/:any*", 7)
103-
.insert("/:org/:repo/releases/download/:tag/:filename.:ext", 8)
104-
.insert("/:org/:repo/tags/:day-:month-:year", 9)
105-
.insert("/:org/:repo/actions/:name\\::verb", 10)
106-
.insert("/:org/:repo/:page", 11)
107-
.insert("/:org/:repo/*", 12)
108-
.insert("/api/+", 13);
95+
tree.insert("/", 0);
96+
tree.insert("/login", 1);
97+
tree.insert("/signup", 2);
98+
tree.insert("/settings", 3);
99+
tree.insert("/settings/:page", 4);
100+
tree.insert("/:user", 5);
101+
tree.insert("/:user/:repo", 6);
102+
tree.insert("/public/:any*", 7);
103+
tree.insert("/:org/:repo/releases/download/:tag/:filename.:ext", 8);
104+
tree.insert("/:org/:repo/tags/:day-:month-:year", 9);
105+
tree.insert("/:org/:repo/actions/:name\\::verb", 10);
106+
tree.insert("/:org/:repo/:page", 11);
107+
tree.insert("/:org/:repo/*", 12);
108+
tree.insert("/api/+", 13);
109109

110110
let r = tree.find("/").unwrap();
111111
assert_eq!(r.value, &0);

src/lib.rs

+24-19
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,20 @@
4242
//! */
4343
//! let mut tree = PathTree::new();
4444
//!
45-
//! tree.insert("/", 0)
46-
//! .insert("/login", 1)
47-
//! .insert("/signup", 2)
48-
//! .insert("/settings", 3)
49-
//! .insert("/settings/:page", 4)
50-
//! .insert("/:user", 5)
51-
//! .insert("/:user/:repo", 6)
52-
//! .insert("/public/:any*", 7)
53-
//! .insert("/:org/:repo/releases/download/:tag/:filename.:ext", 8)
54-
//! .insert("/:org/:repo/tags/:day-:month-:year", 9)
55-
//! .insert("/:org/:repo/actions/:name\\::verb", 10)
56-
//! .insert("/:org/:repo/:page", 11)
57-
//! .insert("/:org/:repo/*", 12)
58-
//! .insert("/api/+", 13);
45+
//! tree.insert("/", 0);
46+
//! tree.insert("/login", 1);
47+
//! tree.insert("/signup", 2);
48+
//! tree.insert("/settings", 3);
49+
//! tree.insert("/settings/:page", 4);
50+
//! tree.insert("/:user", 5);
51+
//! tree.insert("/:user/:repo", 6);
52+
//! tree.insert("/public/:any*", 7);
53+
//! tree.insert("/:org/:repo/releases/download/:tag/:filename.:ext", 8);
54+
//! tree.insert("/:org/:repo/tags/:day-:month-:year", 9);
55+
//! tree.insert("/:org/:repo/actions/:name\\::verb", 10);
56+
//! tree.insert("/:org/:repo/:page", 11);
57+
//! tree.insert("/:org/:repo/*", 12);
58+
//! tree.insert("/api/+", 13);
5959
//!
6060
//! let r = tree.find("/").unwrap();
6161
//! assert_eq!(r.value, &0);
@@ -166,9 +166,9 @@ impl<'a, T> PathTree<'a, T> {
166166
}
167167
}
168168

169-
pub fn insert(&mut self, path: &'a str, value: T) -> &mut Self {
169+
pub fn insert(&mut self, path: &'a str, value: T) -> usize {
170170
if path.is_empty() {
171-
return self;
171+
return self.id;
172172
}
173173

174174
let mut node = &mut self.node;
@@ -185,10 +185,15 @@ impl<'a, T> PathTree<'a, T> {
185185
}
186186
}
187187

188-
node.value = Some(self.id);
189188
self.routes.push((value, pieces));
190-
self.id += 1;
191-
self
189+
if let Some(id) = node.value {
190+
id
191+
} else {
192+
let id = self.id;
193+
node.value = Some(id);
194+
self.id += 1;
195+
id
196+
}
192197
}
193198

194199
pub fn find<'b>(&'a self, path: &'b str) -> Option<Path<'a, 'b, T>> {

tests/tree.rs

+20-15
Original file line numberDiff line numberDiff line change
@@ -1664,20 +1664,20 @@ fn match_params() {
16641664
fn basic() {
16651665
let mut tree = PathTree::<'static, usize>::new();
16661666

1667-
tree.insert("/", 0)
1668-
.insert("/login", 1)
1669-
.insert("/signup", 2)
1670-
.insert("/settings", 3)
1671-
.insert("/settings/:page", 4)
1672-
.insert("/:user", 5)
1673-
.insert("/:user/:repo", 6)
1674-
.insert("/public/:any*", 7)
1675-
.insert("/:org/:repo/releases/download/:tag/:filename.:ext", 8)
1676-
.insert("/:org/:repo/tags/:day-:month-:year", 9)
1677-
.insert("/:org/:repo/actions/:name\\::verb", 10)
1678-
.insert("/:org/:repo/:page", 11)
1679-
.insert("/:org/:repo/*", 12)
1680-
.insert("/api/+", 13);
1667+
tree.insert("/", 0);
1668+
tree.insert("/login", 1);
1669+
tree.insert("/signup", 2);
1670+
tree.insert("/settings", 3);
1671+
tree.insert("/settings/:page", 4);
1672+
tree.insert("/:user", 5);
1673+
tree.insert("/:user/:repo", 6);
1674+
tree.insert("/public/:any*", 7);
1675+
tree.insert("/:org/:repo/releases/download/:tag/:filename.:ext", 8);
1676+
tree.insert("/:org/:repo/tags/:day-:month-:year", 9);
1677+
tree.insert("/:org/:repo/actions/:name\\::verb", 10);
1678+
tree.insert("/:org/:repo/:page", 11);
1679+
tree.insert("/:org/:repo/*", 12);
1680+
tree.insert("/api/+", 13);
16811681

16821682
assert_eq!(
16831683
format!("{:?}", &tree.node),
@@ -1945,7 +1945,12 @@ fn github_tree() {
19451945

19461946
tree.insert("/:org/:repo/*", 3000);
19471947
tree.insert("/:org/:repo/releases/*", 3001);
1948-
tree.insert("/:org/:repo/releases/download/:tag/:filename.:ext", 3002);
1948+
let id = tree.insert("/:org/:repo/releases/download/:tag/:filename.:ext", 3002);
1949+
assert_eq!(
1950+
tree.url_for(id, &["viz-rs", "path-tree", "v0.5.0", "v0.5.0", "gz"])
1951+
.unwrap(),
1952+
"/viz-rs/path-tree/releases/download/v0.5.0/v0.5.0.gz"
1953+
);
19491954

19501955
assert_eq!(
19511956
format!("{:?}", &tree.node),

0 commit comments

Comments
 (0)