1
1
#[ macro_escape] ;
2
2
3
- use std:: str:: CharIterator ;
4
- use std:: io:: Writer ;
3
+ use std:: str:: Chars ;
4
+ use std:: io:: IoResult ;
5
5
6
6
struct ParseBranch {
7
7
matches : ~[ u8 ] ,
@@ -22,7 +22,7 @@ impl ParseBranch {
22
22
pub fn branchify ( options : & [ ( & str , & str ) ] , case_sensitive : bool ) -> ~[ ParseBranch ] {
23
23
let mut root = ParseBranch :: new ( ) ;
24
24
25
- fn go_down_moses ( branch : & mut ParseBranch , mut chariter : CharIterator , result : & str , case_sensitive : bool ) {
25
+ fn go_down_moses ( branch : & mut ParseBranch , mut chariter : Chars , result : & str , case_sensitive : bool ) {
26
26
match chariter. next ( ) {
27
27
Some ( c) => {
28
28
let first_case = if case_sensitive { c as u8 } else { c. to_ascii ( ) . to_upper ( ) . to_byte ( ) } ;
@@ -85,60 +85,66 @@ pub fn generate_branchified_method(
85
85
end : & str ,
86
86
max_len : & str ,
87
87
valid : & str ,
88
- unknown : & str ) {
88
+ unknown : & str ) -> IoResult < ( ) > {
89
89
90
90
fn r ( writer : & mut Writer , branch : & ParseBranch , prefix : & str , indent : uint , read_call : & str ,
91
- end : & str , max_len : & str , valid : & str , unknown : & str ) {
91
+ end : & str , max_len : & str , valid : & str , unknown : & str ) -> IoResult < ( ) > {
92
92
let indentstr = " " . repeat ( indent * 4 ) ;
93
- let w = | s : & str | {
94
- writer . write ( indentstr . as_bytes ( ) ) ;
95
- writer . write ( s . as_bytes ( ) ) ;
96
- writer . write ( bytes ! ( " \n " ) ) ;
97
- } ;
93
+ macro_rules! w (
94
+ ( $s : expr ) => {
95
+ try! ( write! ( writer , "{}{} \n " , indentstr , $s ) )
96
+ }
97
+ )
98
98
for & c in branch. matches . iter ( ) {
99
99
let next_prefix = format ! ( "{}{}" , prefix, c as char ) ;
100
- w ( format ! ( "Some (b) if b == '{}' as u8 => match {} \\ {" , c as char , read_call) ) ;
100
+ w ! ( format!( "Ok (b) if b == '{}' as u8 => match {} \\ {" , c as char , read_call) ) ;
101
101
for b in branch. children . iter ( ) {
102
- r ( writer, b, next_prefix, indent + 1 , read_call, end, max_len, valid, unknown) ;
102
+ try! ( r ( writer, b, next_prefix, indent + 1 , read_call, end, max_len, valid, unknown) ) ;
103
103
}
104
104
match branch. result {
105
- Some ( ref result) => w ( format ! ( " Some(b) if b == SP => return Some({})," , * result) ) ,
106
- None => w ( format ! ( " Some(b) if b == SP => return Some({})," ,
105
+ Some ( ref result) =>
106
+ w ! ( format!( " Ok(b) if b == SP => return Ok({})," , * result) ) ,
107
+ None => w ! ( format!( " Ok(b) if b == SP => return Ok({})," ,
107
108
unknown. replace( "{}" , format!( "~\" {}\" " , next_prefix) ) ) ) ,
108
109
}
109
- w ( format ! ( " Some(b) if {} => (\" {}\" , b)," , valid, next_prefix) ) ;
110
- w ( " _ => return None," ) ;
111
- w ( "}," ) ;
110
+ w ! ( format!( " Ok(b) if {} => (\" {}\" , b)," , valid, next_prefix) ) ;
111
+ w ! ( " Ok(_) => return Err(::std::io::IoError { kind: ::std::io::OtherIoError, desc: \" bad value\" , detail: None })," ) ;
112
+ w ! ( " Err(err) => return Err(err)," ) ;
113
+ w ! ( "}," ) ;
112
114
}
115
+ Ok ( ( ) )
113
116
}
114
117
let indentstr = " " . repeat ( indent * 4 ) ;
115
- let w = | s : & str | {
116
- writer . write ( indentstr . as_bytes ( ) ) ;
117
- writer . write ( s . as_bytes ( ) ) ;
118
- writer . write ( bytes ! ( " \n " ) ) ;
119
- } ;
118
+ macro_rules! w (
119
+ ( $s : expr ) => {
120
+ try! ( write! ( writer , "{}{} \n " , indentstr , $s ) )
121
+ }
122
+ )
120
123
121
- w ( format ! ( "let (s, next_byte) = match {} \\ {" , read_call) ) ;
124
+ w ! ( format!( "let (s, next_byte) = match {} \\ {" , read_call) ) ;
122
125
for b in branches. iter ( ) {
123
- r ( writer, b, "" , indent + 1 , read_call, end, max_len, valid, unknown) ;
126
+ try! ( r ( writer, b, "" , indent + 1 , read_call, end, max_len, valid, unknown) ) ;
124
127
}
125
- w ( format ! ( " Some(b) if {} => (\" \" , b)," , valid) ) ;
126
- w ( ( " _ => return None," ) ) ;
127
- w ( ( "};" ) ) ;
128
- w ( ( "// OK, that didn't pan out. Let's read the rest and see what we get." ) ) ;
129
- w ( ( "let mut s = s.to_owned();" ) ) ;
130
- w ( ( "s.push_char(next_byte as char);" ) ) ;
131
- w ( ( "loop {" ) ) ;
132
- w ( format ! ( " match {} \\ {" , read_call) ) ;
133
- w ( format ! ( " Some(b) if b == {} => return Some({})," , end, unknown. replace( "{}" , "s" ) ) ) ;
134
- w ( format ! ( " Some(b) if {} => \\ {" , valid) ) ;
135
- w ( format ! ( " if s.len() == {} \\ {" , max_len) ) ;
136
- w ( ( " // Too long; bad request" ) ) ;
137
- w ( ( " return None;" ) ) ;
138
- w ( ( " }" ) ) ;
139
- w ( ( " s.push_char(b as char);" ) ) ;
140
- w ( ( " }," ) ) ;
141
- w ( ( " _ => return None," ) ) ;
142
- w ( ( " }" ) ) ;
143
- w ( ( "}" ) ) ;
128
+ w ! ( format!( " Ok(b) if {} => (\" \" , b)," , valid) ) ;
129
+ w ! ( ( " Ok(_) => return Err(::std::io::IoError { kind: ::std::io::OtherIoError, desc: \" bad value\" , detail: None })," ) ) ;
130
+ w ! ( ( " Err(err) => return Err(err)," ) ) ;
131
+ w ! ( ( "};" ) ) ;
132
+ w ! ( ( "// OK, that didn't pan out. Let's read the rest and see what we get." ) ) ;
133
+ w ! ( ( "let mut s = s.to_owned();" ) ) ;
134
+ w ! ( ( "s.push_char(next_byte as char);" ) ) ;
135
+ w ! ( ( "loop {" ) ) ;
136
+ w ! ( format!( " match {} \\ {" , read_call) ) ;
137
+ w ! ( format!( " Ok(b) if b == {} => return Ok({})," , end, unknown. replace( "{}" , "s" ) ) ) ;
138
+ w ! ( format!( " Ok(b) if {} => \\ {" , valid) ) ;
139
+ w ! ( format!( " if s.len() == {} \\ {" , max_len) ) ;
140
+ w ! ( ( " // Too long; bad request" ) ) ;
141
+ w ! ( ( " return Err(::std::io::IoError { kind: ::std::io::OtherIoError, desc: \" too long, bad request\" , detail: None });" ) ) ;
142
+ w ! ( ( " }" ) ) ;
143
+ w ! ( ( " s.push_char(b as char);" ) ) ;
144
+ w ! ( ( " }," ) ) ;
145
+ w ! ( ( " Ok(_) => return Err(::std::io::IoError { kind: ::std::io::OtherIoError, desc: \" bad value\" , detail: None })," ) ) ;
146
+ w ! ( ( " Err(err) => return Err(err)," ) ) ;
147
+ w ! ( ( " }" ) ) ;
148
+ w ! ( ( "}" ) ) ;
149
+ Ok ( ( ) )
144
150
}
0 commit comments