Skip to content

Commit acbb42a

Browse files
committed
Add support for dynamic segments
1 parent 4d8011f commit acbb42a

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

src/lib.rs

+35-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,14 @@ impl Router {
2525
let nfa = &mut self.nfa;
2626
let mut state = 0;
2727

28-
for char in route.chars() {
29-
state = nfa.put(state, CharacterClass::valid_char(char));
28+
for (i, segment) in route.split('/').enumerate() {
29+
if i > 0 { state = nfa.put(state, CharacterClass::valid_char('/')); }
30+
31+
if segment.char_at(0) == ':' {
32+
state = process_dynamic_segment(nfa, state);
33+
} else {
34+
state = process_static_segment(segment, nfa, state);
35+
}
3036
}
3137

3238
nfa.acceptance(state);
@@ -47,6 +53,21 @@ impl Router {
4753
}
4854
}
4955

56+
fn process_static_segment(segment: &str, nfa: &mut NFA, mut state: uint) -> uint {
57+
for char in segment.chars() {
58+
state = nfa.put(state, CharacterClass::valid_char(char));
59+
}
60+
61+
state
62+
}
63+
64+
fn process_dynamic_segment(nfa: &mut NFA, mut state: uint) -> uint {
65+
state = nfa.put(state, CharacterClass::invalid_char('/'));
66+
nfa.put_state(state, state);
67+
68+
state
69+
}
70+
5071
#[test]
5172
fn basic_router() {
5273
let mut router = Router::new();
@@ -59,3 +80,15 @@ fn basic_router() {
5980
StringHandler(ref str) => assert!(str == &~"Thomas", "/thomas matched")
6081
}
6182
}
83+
84+
#[test]
85+
fn ambiguous_router() {
86+
let mut router = Router::new();
87+
88+
router.add("/posts/new", StringHandler(~"new"));
89+
router.add("/posts/:id", StringHandler(~"id"));
90+
91+
match *router.recognize("/posts/1").unwrap() {
92+
StringHandler(ref str) => assert!(str == &~"id", "/posts/1 matched")
93+
}
94+
}

0 commit comments

Comments
 (0)