@@ -25,8 +25,14 @@ impl Router {
25
25
let nfa = & mut self . nfa ;
26
26
let mut state = 0 ;
27
27
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
+ }
30
36
}
31
37
32
38
nfa. acceptance ( state) ;
@@ -47,6 +53,21 @@ impl Router {
47
53
}
48
54
}
49
55
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
+
50
71
#[ test]
51
72
fn basic_router ( ) {
52
73
let mut router = Router :: new ( ) ;
@@ -59,3 +80,15 @@ fn basic_router() {
59
80
StringHandler ( ref str) => assert ! ( str == & ~"Thomas ", " /thomas matched")
60
81
}
61
82
}
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