11
11
//! Buffering wrappers for I/O traits
12
12
13
13
use container:: Container ;
14
- use io:: { Reader , Writer , Stream , Buffer , DEFAULT_BUF_SIZE } ;
14
+ use io:: { Reader , Writer , Stream , Buffer , DEFAULT_BUF_SIZE , IoResult } ;
15
15
use iter:: ExactSize ;
16
16
use num;
17
- use option:: { Option , Some , None } ;
17
+ use option:: { Some , None } ;
18
+ use result:: { Ok , Err } ;
18
19
use vec:: { OwnedVector , ImmutableVector , MutableVector } ;
19
20
use vec;
20
21
@@ -86,17 +87,12 @@ impl<R: Reader> BufferedReader<R> {
86
87
}
87
88
88
89
impl < R : Reader > Buffer for BufferedReader < R > {
89
- fn fill < ' a > ( & ' a mut self ) -> & ' a [ u8 ] {
90
- if self . pos == self . cap {
91
- match self . inner . read ( self . buf ) {
92
- Some ( cap) => {
93
- self . pos = 0 ;
94
- self . cap = cap;
95
- }
96
- None => { self . eof = true ; }
97
- }
90
+ fn fill < ' a > ( & ' a mut self ) -> IoResult < & ' a [ u8 ] > {
91
+ while self . pos == self . cap {
92
+ self . cap = if_ok ! ( self . inner. read( self . buf) ) ;
93
+ self . pos = 0 ;
98
94
}
99
- return self . buf . slice ( self . pos , self . cap ) ;
95
+ Ok ( self . buf . slice ( self . pos , self . cap ) )
100
96
}
101
97
102
98
fn consume ( & mut self , amt : uint ) {
@@ -106,18 +102,15 @@ impl<R: Reader> Buffer for BufferedReader<R> {
106
102
}
107
103
108
104
impl < R : Reader > Reader for BufferedReader < R > {
109
- fn read ( & mut self , buf : & mut [ u8 ] ) -> Option < uint > {
105
+ fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
110
106
let nread = {
111
- let available = self . fill ( ) ;
107
+ let available = if_ok ! ( self . fill( ) ) ;
112
108
let nread = num:: min ( available. len ( ) , buf. len ( ) ) ;
113
109
vec:: bytes:: copy_memory ( buf, available. slice_to ( nread) ) ;
114
110
nread
115
111
} ;
116
112
self . pos += nread;
117
- if nread == 0 && buf. len ( ) != 0 && self . eof {
118
- return None ;
119
- }
120
- Some ( nread)
113
+ Ok ( nread)
121
114
}
122
115
}
123
116
@@ -161,10 +154,13 @@ impl<W: Writer> BufferedWriter<W> {
161
154
BufferedWriter :: with_capacity ( DEFAULT_BUF_SIZE , inner)
162
155
}
163
156
164
- fn flush_buf ( & mut self ) {
157
+ fn flush_buf ( & mut self ) -> IoResult < ( ) > {
165
158
if self . pos != 0 {
166
- self . inner . write ( self . buf . slice_to ( self . pos ) ) ;
159
+ let ret = self . inner . write ( self . buf . slice_to ( self . pos ) ) ;
167
160
self . pos = 0 ;
161
+ ret
162
+ } else {
163
+ Ok ( ( ) )
168
164
}
169
165
}
170
166
@@ -178,29 +174,30 @@ impl<W: Writer> BufferedWriter<W> {
178
174
///
179
175
/// The buffer is flushed before returning the writer.
180
176
pub fn unwrap ( mut self ) -> W {
181
- self . flush_buf ( ) ;
177
+ // FIXME: is failing the right thing to do if flushing fails?
178
+ self . flush_buf ( ) . unwrap ( ) ;
182
179
self . inner
183
180
}
184
181
}
185
182
186
183
impl < W : Writer > Writer for BufferedWriter < W > {
187
- fn write ( & mut self , buf : & [ u8 ] ) {
184
+ fn write ( & mut self , buf : & [ u8 ] ) -> IoResult < ( ) > {
188
185
if self . pos + buf. len ( ) > self . buf . len ( ) {
189
- self . flush_buf ( ) ;
186
+ if_ok ! ( self . flush_buf( ) ) ;
190
187
}
191
188
192
189
if buf. len ( ) > self . buf . len ( ) {
193
- self . inner . write ( buf) ;
190
+ self . inner . write ( buf)
194
191
} else {
195
192
let dst = self . buf . mut_slice_from ( self . pos ) ;
196
193
vec:: bytes:: copy_memory ( dst, buf) ;
197
194
self . pos += buf. len ( ) ;
195
+ Ok ( ( ) )
198
196
}
199
197
}
200
198
201
- fn flush ( & mut self ) {
202
- self . flush_buf ( ) ;
203
- self . inner . flush ( ) ;
199
+ fn flush ( & mut self ) -> IoResult < ( ) > {
200
+ self . flush_buf ( ) . and_then ( |( ) | self . inner . flush ( ) )
204
201
}
205
202
}
206
203
@@ -234,18 +231,19 @@ impl<W: Writer> LineBufferedWriter<W> {
234
231
}
235
232
236
233
impl < W : Writer > Writer for LineBufferedWriter < W > {
237
- fn write ( & mut self , buf : & [ u8 ] ) {
234
+ fn write ( & mut self , buf : & [ u8 ] ) -> IoResult < ( ) > {
238
235
match buf. iter ( ) . rposition ( |& b| b == '\n' as u8 ) {
239
236
Some ( i) => {
240
- self . inner . write ( buf. slice_to ( i + 1 ) ) ;
241
- self . inner . flush ( ) ;
242
- self . inner . write ( buf. slice_from ( i + 1 ) ) ;
237
+ if_ok ! ( self . inner. write( buf. slice_to( i + 1 ) ) ) ;
238
+ if_ok ! ( self . inner. flush( ) ) ;
239
+ if_ok ! ( self . inner. write( buf. slice_from( i + 1 ) ) ) ;
240
+ Ok ( ( ) )
243
241
}
244
242
None => self . inner . write ( buf) ,
245
243
}
246
244
}
247
245
248
- fn flush ( & mut self ) { self . inner . flush ( ) }
246
+ fn flush ( & mut self ) -> IoResult < ( ) > { self . inner . flush ( ) }
249
247
}
250
248
251
249
struct InternalBufferedWriter < W > ( BufferedWriter < W > ) ;
@@ -258,7 +256,9 @@ impl<W> InternalBufferedWriter<W> {
258
256
}
259
257
260
258
impl < W : Reader > Reader for InternalBufferedWriter < W > {
261
- fn read ( & mut self , buf : & mut [ u8 ] ) -> Option < uint > { self . get_mut_ref ( ) . inner . read ( buf) }
259
+ fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
260
+ self . get_mut_ref ( ) . inner . read ( buf)
261
+ }
262
262
}
263
263
264
264
/// Wraps a Stream and buffers input and output to and from it
@@ -326,17 +326,23 @@ impl<S: Stream> BufferedStream<S> {
326
326
}
327
327
328
328
impl < S : Stream > Buffer for BufferedStream < S > {
329
- fn fill < ' a > ( & ' a mut self ) -> & ' a [ u8 ] { self . inner . fill ( ) }
329
+ fn fill < ' a > ( & ' a mut self ) -> IoResult < & ' a [ u8 ] > { self . inner . fill ( ) }
330
330
fn consume ( & mut self , amt : uint ) { self . inner . consume ( amt) }
331
331
}
332
332
333
333
impl < S : Stream > Reader for BufferedStream < S > {
334
- fn read ( & mut self , buf : & mut [ u8 ] ) -> Option < uint > { self . inner . read ( buf) }
334
+ fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
335
+ self . inner . read ( buf)
336
+ }
335
337
}
336
338
337
339
impl < S : Stream > Writer for BufferedStream < S > {
338
- fn write ( & mut self , buf : & [ u8 ] ) { self . inner . inner . get_mut_ref ( ) . write ( buf) }
339
- fn flush ( & mut self ) { self . inner . inner . get_mut_ref ( ) . flush ( ) }
340
+ fn write ( & mut self , buf : & [ u8 ] ) -> IoResult < ( ) > {
341
+ self . inner . inner . get_mut_ref ( ) . write ( buf)
342
+ }
343
+ fn flush ( & mut self ) -> IoResult < ( ) > {
344
+ self . inner . inner . get_mut_ref ( ) . flush ( )
345
+ }
340
346
}
341
347
342
348
#[ cfg( test) ]
0 commit comments