Skip to content

Commit ece8a8f

Browse files
committed
std: Remove io::io_error
* All I/O now returns IoResult<T> = Result<T, IoError> * All formatting traits now return fmt::Result = IoResult<()> * The if_ok!() macro was added to libstd
1 parent be4fc63 commit ece8a8f

35 files changed

+920
-1061
lines changed

src/libstd/fmt/mod.rs

Lines changed: 92 additions & 86 deletions
Large diffs are not rendered by default.

src/libstd/hash.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@
2727
#[allow(missing_doc)];
2828

2929
use container::Container;
30+
use io::{Writer, IoResult};
3031
use iter::Iterator;
32+
use num::ToStrRadix;
3133
use option::{Some, None};
32-
use io::Writer;
34+
use result::Ok;
3335
use str::OwnedStr;
3436
use to_bytes::IterBytes;
3537
use vec::ImmutableVector;
36-
use num::ToStrRadix;
3738

3839
// Alias `SipState` to `State`.
3940
pub use State = hash::SipState;
@@ -164,7 +165,7 @@ macro_rules! compress (
164165
impl Writer for SipState {
165166
// Methods for io::writer
166167
#[inline]
167-
fn write(&mut self, msg: &[u8]) {
168+
fn write(&mut self, msg: &[u8]) -> IoResult<()> {
168169
let length = msg.len();
169170
self.length += length;
170171

@@ -180,7 +181,7 @@ impl Writer for SipState {
180181
t += 1;
181182
}
182183
self.ntail += length;
183-
return;
184+
return Ok(())
184185
}
185186

186187
let mut t = 0;
@@ -222,17 +223,14 @@ impl Writer for SipState {
222223
t += 1
223224
}
224225
self.ntail = left;
225-
}
226-
227-
fn flush(&mut self) {
228-
// No-op
226+
Ok(())
229227
}
230228
}
231229

232230
impl Streaming for SipState {
233231
#[inline]
234232
fn input(&mut self, buf: &[u8]) {
235-
self.write(buf);
233+
self.write(buf).unwrap();
236234
}
237235

238236
#[inline]

src/libstd/io/buffered.rs

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
//! Buffering wrappers for I/O traits
1212
1313
use container::Container;
14-
use io::{Reader, Writer, Stream, Buffer, DEFAULT_BUF_SIZE};
14+
use io::{Reader, Writer, Stream, Buffer, DEFAULT_BUF_SIZE, IoResult};
1515
use iter::ExactSize;
1616
use num;
17-
use option::{Option, Some, None};
17+
use option::{Some, None};
18+
use result::{Ok, Err};
1819
use vec::{OwnedVector, ImmutableVector, MutableVector};
1920
use vec;
2021

@@ -86,17 +87,12 @@ impl<R: Reader> BufferedReader<R> {
8687
}
8788

8889
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;
9894
}
99-
return self.buf.slice(self.pos, self.cap);
95+
Ok(self.buf.slice(self.pos, self.cap))
10096
}
10197

10298
fn consume(&mut self, amt: uint) {
@@ -106,18 +102,15 @@ impl<R: Reader> Buffer for BufferedReader<R> {
106102
}
107103

108104
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> {
110106
let nread = {
111-
let available = self.fill();
107+
let available = if_ok!(self.fill());
112108
let nread = num::min(available.len(), buf.len());
113109
vec::bytes::copy_memory(buf, available.slice_to(nread));
114110
nread
115111
};
116112
self.pos += nread;
117-
if nread == 0 && buf.len() != 0 && self.eof {
118-
return None;
119-
}
120-
Some(nread)
113+
Ok(nread)
121114
}
122115
}
123116

@@ -161,10 +154,13 @@ impl<W: Writer> BufferedWriter<W> {
161154
BufferedWriter::with_capacity(DEFAULT_BUF_SIZE, inner)
162155
}
163156

164-
fn flush_buf(&mut self) {
157+
fn flush_buf(&mut self) -> IoResult<()> {
165158
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));
167160
self.pos = 0;
161+
ret
162+
} else {
163+
Ok(())
168164
}
169165
}
170166

@@ -178,29 +174,30 @@ impl<W: Writer> BufferedWriter<W> {
178174
///
179175
/// The buffer is flushed before returning the writer.
180176
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();
182179
self.inner
183180
}
184181
}
185182

186183
impl<W: Writer> Writer for BufferedWriter<W> {
187-
fn write(&mut self, buf: &[u8]) {
184+
fn write(&mut self, buf: &[u8]) -> IoResult<()> {
188185
if self.pos + buf.len() > self.buf.len() {
189-
self.flush_buf();
186+
if_ok!(self.flush_buf());
190187
}
191188

192189
if buf.len() > self.buf.len() {
193-
self.inner.write(buf);
190+
self.inner.write(buf)
194191
} else {
195192
let dst = self.buf.mut_slice_from(self.pos);
196193
vec::bytes::copy_memory(dst, buf);
197194
self.pos += buf.len();
195+
Ok(())
198196
}
199197
}
200198

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())
204201
}
205202
}
206203

@@ -234,18 +231,19 @@ impl<W: Writer> LineBufferedWriter<W> {
234231
}
235232

236233
impl<W: Writer> Writer for LineBufferedWriter<W> {
237-
fn write(&mut self, buf: &[u8]) {
234+
fn write(&mut self, buf: &[u8]) -> IoResult<()> {
238235
match buf.iter().rposition(|&b| b == '\n' as u8) {
239236
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(())
243241
}
244242
None => self.inner.write(buf),
245243
}
246244
}
247245

248-
fn flush(&mut self) { self.inner.flush() }
246+
fn flush(&mut self) -> IoResult<()> { self.inner.flush() }
249247
}
250248

251249
struct InternalBufferedWriter<W>(BufferedWriter<W>);
@@ -258,7 +256,9 @@ impl<W> InternalBufferedWriter<W> {
258256
}
259257

260258
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+
}
262262
}
263263

264264
/// Wraps a Stream and buffers input and output to and from it
@@ -326,17 +326,23 @@ impl<S: Stream> BufferedStream<S> {
326326
}
327327

328328
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() }
330330
fn consume(&mut self, amt: uint) { self.inner.consume(amt) }
331331
}
332332

333333
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+
}
335337
}
336338

337339
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+
}
340346
}
341347

342348
#[cfg(test)]

src/libstd/io/comm_adapters.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use comm::{Port, Chan};
1414
use cmp;
1515
use io;
1616
use option::{None, Option, Some};
17-
use super::{Reader, Writer};
17+
use super::{Reader, Writer, IoResult};
1818
use vec::{bytes, CloneableVector, MutableVector, ImmutableVector};
1919

2020
/// Allows reading from a port.
@@ -49,7 +49,7 @@ impl PortReader {
4949
}
5050

5151
impl Reader for PortReader {
52-
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
52+
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
5353
let mut num_read = 0;
5454
loop {
5555
match self.buf {
@@ -71,10 +71,9 @@ impl Reader for PortReader {
7171
self.closed = self.buf.is_none();
7272
}
7373
if self.closed && num_read == 0 {
74-
io::io_error::cond.raise(io::standard_error(io::EndOfFile));
75-
None
74+
Err(io::standard_error(io::EndOfFile))
7675
} else {
77-
Some(num_read)
76+
Ok(num_read)
7877
}
7978
}
8079
}
@@ -98,13 +97,15 @@ impl ChanWriter {
9897
}
9998

10099
impl Writer for ChanWriter {
101-
fn write(&mut self, buf: &[u8]) {
100+
fn write(&mut self, buf: &[u8]) -> IoResult<()> {
102101
if !self.chan.try_send(buf.to_owned()) {
103-
io::io_error::cond.raise(io::IoError {
102+
Err(io::IoError {
104103
kind: io::BrokenPipe,
105104
desc: "Pipe closed",
106105
detail: None
107-
});
106+
})
107+
} else {
108+
Ok(())
108109
}
109110
}
110111
}

src/libstd/io/extensions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ impl<'r, R: Reader> Bytes<'r, R> {
4646
impl<'r, R: Reader> Iterator<u8> for Bytes<'r, R> {
4747
#[inline]
4848
fn next(&mut self) -> Option<u8> {
49-
self.reader.read_byte()
49+
self.reader.read_byte().ok()
5050
}
5151
}
5252

0 commit comments

Comments
 (0)