]> git.lizzy.rs Git - rust.git/blob - src/libstd/io/mod.rs
return &mut T from the arenas, not &T
[rust.git] / src / libstd / io / mod.rs
1 // Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10 //
11 // ignore-lexer-test FIXME #15883
12
13 // FIXME: cover these topics:
14 //        path, reader, writer, stream, raii (close not needed),
15 //        stdio, print!, println!, file access, process spawning,
16 //        error handling
17
18
19 /*! I/O, including files, networking, timers, and processes
20
21 `std::io` provides Rust's basic I/O types,
22 for reading and writing to files, TCP, UDP,
23 and other types of sockets and pipes,
24 manipulating the file system, spawning processes.
25
26 # Examples
27
28 Some examples of obvious things you might want to do
29
30 * Read lines from stdin
31
32     ```rust
33     use std::io;
34
35     for line in io::stdin().lines() {
36         print!("{}", line.unwrap());
37     }
38     ```
39
40 * Read a complete file
41
42     ```rust
43     use std::io::File;
44
45     let contents = File::open(&Path::new("message.txt")).read_to_end();
46     ```
47
48 * Write a line to a file
49
50     ```rust
51     # #![allow(unused_must_use)]
52     use std::io::File;
53
54     let mut file = File::create(&Path::new("message.txt"));
55     file.write(b"hello, file!\n");
56     # drop(file);
57     # ::std::io::fs::unlink(&Path::new("message.txt"));
58     ```
59
60 * Iterate over the lines of a file
61
62     ```rust,no_run
63     use std::io::BufferedReader;
64     use std::io::File;
65
66     let path = Path::new("message.txt");
67     let mut file = BufferedReader::new(File::open(&path));
68     for line in file.lines() {
69         print!("{}", line.unwrap());
70     }
71     ```
72
73 * Pull the lines of a file into a vector of strings
74
75     ```rust,no_run
76     use std::io::BufferedReader;
77     use std::io::File;
78
79     let path = Path::new("message.txt");
80     let mut file = BufferedReader::new(File::open(&path));
81     let lines: Vec<String> = file.lines().map(|x| x.unwrap()).collect();
82     ```
83
84 * Make a simple TCP client connection and request
85
86     ```rust
87     # #![allow(unused_must_use)]
88     use std::io::TcpStream;
89
90     # // connection doesn't fail if a server is running on 8080
91     # // locally, we still want to be type checking this code, so lets
92     # // just stop it running (#11576)
93     # if false {
94     let mut socket = TcpStream::connect("127.0.0.1", 8080).unwrap();
95     socket.write(b"GET / HTTP/1.0\n\n");
96     let response = socket.read_to_end();
97     # }
98     ```
99
100 * Make a simple TCP server
101
102     ```rust
103     # fn main() { }
104     # fn foo() {
105     # #![allow(dead_code)]
106     use std::io::{TcpListener, TcpStream};
107     use std::io::{Acceptor, Listener};
108
109     let listener = TcpListener::bind("127.0.0.1", 80);
110
111     // bind the listener to the specified address
112     let mut acceptor = listener.listen();
113
114     fn handle_client(mut stream: TcpStream) {
115         // ...
116     # &mut stream; // silence unused mutability/variable warning
117     }
118     // accept connections and process them, spawning a new tasks for each one
119     for stream in acceptor.incoming() {
120         match stream {
121             Err(e) => { /* connection failed */ }
122             Ok(stream) => spawn(proc() {
123                 // connection succeeded
124                 handle_client(stream)
125             })
126         }
127     }
128
129     // close the socket server
130     drop(acceptor);
131     # }
132     ```
133
134
135 # Error Handling
136
137 I/O is an area where nearly every operation can result in unexpected
138 errors. Errors should be painfully visible when they happen, and handling them
139 should be easy to work with. It should be convenient to handle specific I/O
140 errors, and it should also be convenient to not deal with I/O errors.
141
142 Rust's I/O employs a combination of techniques to reduce boilerplate
143 while still providing feedback about errors. The basic strategy:
144
145 * All I/O operations return `IoResult<T>` which is equivalent to
146   `Result<T, IoError>`. The `Result` type is defined in the `std::result`
147   module.
148 * If the `Result` type goes unused, then the compiler will by default emit a
149   warning about the unused result. This is because `Result` has the
150   `#[must_use]` attribute.
151 * Common traits are implemented for `IoResult`, e.g.
152   `impl<R: Reader> Reader for IoResult<R>`, so that error values do not have
153   to be 'unwrapped' before use.
154
155 These features combine in the API to allow for expressions like
156 `File::create(&Path::new("diary.txt")).write(b"Met a girl.\n")`
157 without having to worry about whether "diary.txt" exists or whether
158 the write succeeds. As written, if either `new` or `write_line`
159 encounters an error then the result of the entire expression will
160 be an error.
161
162 If you wanted to handle the error though you might write:
163
164 ```rust
165 # #![allow(unused_must_use)]
166 use std::io::File;
167
168 match File::create(&Path::new("diary.txt")).write(b"Met a girl.\n") {
169     Ok(()) => (), // succeeded
170     Err(e) => println!("failed to write to my diary: {}", e),
171 }
172
173 # ::std::io::fs::unlink(&Path::new("diary.txt"));
174 ```
175
176 So what actually happens if `create` encounters an error?
177 It's important to know that what `new` returns is not a `File`
178 but an `IoResult<File>`.  If the file does not open, then `new` will simply
179 return `Err(..)`. Because there is an implementation of `Writer` (the trait
180 required ultimately required for types to implement `write_line`) there is no
181 need to inspect or unwrap the `IoResult<File>` and we simply call `write_line`
182 on it. If `new` returned an `Err(..)` then the followup call to `write_line`
183 will also return an error.
184
185 ## `try!`
186
187 Explicit pattern matching on `IoResult`s can get quite verbose, especially
188 when performing many I/O operations. Some examples (like those above) are
189 alleviated with extra methods implemented on `IoResult`, but others have more
190 complex interdependencies among each I/O operation.
191
192 The `try!` macro from `std::macros` is provided as a method of early-return
193 inside `Result`-returning functions. It expands to an early-return on `Err`
194 and otherwise unwraps the contained `Ok` value.
195
196 If you wanted to read several `u32`s from a file and return their product:
197
198 ```rust
199 use std::io::{File, IoResult};
200
201 fn file_product(p: &Path) -> IoResult<u32> {
202     let mut f = File::open(p);
203     let x1 = try!(f.read_le_u32());
204     let x2 = try!(f.read_le_u32());
205
206     Ok(x1 * x2)
207 }
208
209 match file_product(&Path::new("numbers.bin")) {
210     Ok(x) => println!("{}", x),
211     Err(e) => println!("Failed to read numbers!")
212 }
213 ```
214
215 With `try!` in `file_product`, each `read_le_u32` need not be directly
216 concerned with error handling; instead its caller is responsible for
217 responding to errors that may occur while attempting to read the numbers.
218
219 */
220
221 #![experimental]
222 #![deny(unused_must_use)]
223
224 use char::Char;
225 use collections::Collection;
226 use default::Default;
227 use fmt;
228 use int;
229 use iter::Iterator;
230 use libc;
231 use mem::transmute;
232 use ops::{BitOr, BitXor, BitAnd, Sub, Not};
233 use option::{Option, Some, None};
234 use os;
235 use boxed::Box;
236 use result::{Ok, Err, Result};
237 use rt::rtio;
238 use slice::{AsSlice, ImmutableSlice};
239 use str::{Str, StrSlice};
240 use str;
241 use string::String;
242 use uint;
243 use unicode::char::UnicodeChar;
244 use vec::Vec;
245
246 // Reexports
247 pub use self::stdio::stdin;
248 pub use self::stdio::stdout;
249 pub use self::stdio::stderr;
250 pub use self::stdio::print;
251 pub use self::stdio::println;
252
253 pub use self::fs::File;
254 pub use self::timer::Timer;
255 pub use self::net::ip::IpAddr;
256 pub use self::net::tcp::TcpListener;
257 pub use self::net::tcp::TcpStream;
258 pub use self::net::udp::UdpStream;
259 pub use self::pipe::PipeStream;
260 pub use self::process::{Process, Command};
261 pub use self::tempfile::TempDir;
262
263 pub use self::mem::{MemReader, BufReader, MemWriter, BufWriter};
264 pub use self::buffered::{BufferedReader, BufferedWriter, BufferedStream,
265                          LineBufferedWriter};
266 pub use self::comm_adapters::{ChanReader, ChanWriter};
267
268 mod buffered;
269 mod comm_adapters;
270 mod mem;
271 mod result;
272 mod tempfile;
273 pub mod extensions;
274 pub mod fs;
275 pub mod net;
276 pub mod pipe;
277 pub mod process;
278 pub mod stdio;
279 pub mod test;
280 pub mod timer;
281 pub mod util;
282
283 /// The default buffer size for various I/O operations
284 // libuv recommends 64k buffers to maximize throughput
285 // https://groups.google.com/forum/#!topic/libuv/oQO1HJAIDdA
286 const DEFAULT_BUF_SIZE: uint = 1024 * 64;
287
288 /// A convenient typedef of the return value of any I/O action.
289 pub type IoResult<T> = Result<T, IoError>;
290
291 /// The type passed to I/O condition handlers to indicate error
292 ///
293 /// # FIXME
294 ///
295 /// Is something like this sufficient? It's kind of archaic
296 #[deriving(PartialEq, Eq, Clone)]
297 pub struct IoError {
298     /// An enumeration which can be matched against for determining the flavor
299     /// of error.
300     pub kind: IoErrorKind,
301     /// A human-readable description about the error
302     pub desc: &'static str,
303     /// Detailed information about this error, not always available
304     pub detail: Option<String>
305 }
306
307 impl IoError {
308     /// Convert an `errno` value into an `IoError`.
309     ///
310     /// If `detail` is `true`, the `detail` field of the `IoError`
311     /// struct is filled with an allocated string describing the error
312     /// in more detail, retrieved from the operating system.
313     pub fn from_errno(errno: uint, detail: bool) -> IoError {
314
315         #[cfg(windows)]
316         fn get_err(errno: i32) -> (IoErrorKind, &'static str) {
317             match errno {
318                 libc::EOF => (EndOfFile, "end of file"),
319                 libc::ERROR_NO_DATA => (BrokenPipe, "the pipe is being closed"),
320                 libc::ERROR_FILE_NOT_FOUND => (FileNotFound, "file not found"),
321                 libc::ERROR_INVALID_NAME => (InvalidInput, "invalid file name"),
322                 libc::WSAECONNREFUSED => (ConnectionRefused, "connection refused"),
323                 libc::WSAECONNRESET => (ConnectionReset, "connection reset"),
324                 libc::ERROR_ACCESS_DENIED | libc::WSAEACCES =>
325                     (PermissionDenied, "permission denied"),
326                 libc::WSAEWOULDBLOCK => {
327                     (ResourceUnavailable, "resource temporarily unavailable")
328                 }
329                 libc::WSAENOTCONN => (NotConnected, "not connected"),
330                 libc::WSAECONNABORTED => (ConnectionAborted, "connection aborted"),
331                 libc::WSAEADDRNOTAVAIL => (ConnectionRefused, "address not available"),
332                 libc::WSAEADDRINUSE => (ConnectionRefused, "address in use"),
333                 libc::ERROR_BROKEN_PIPE => (EndOfFile, "the pipe has ended"),
334                 libc::ERROR_OPERATION_ABORTED =>
335                     (TimedOut, "operation timed out"),
336                 libc::WSAEINVAL => (InvalidInput, "invalid argument"),
337                 libc::ERROR_CALL_NOT_IMPLEMENTED =>
338                     (IoUnavailable, "function not implemented"),
339                 libc::ERROR_INVALID_HANDLE =>
340                     (MismatchedFileTypeForOperation,
341                      "invalid handle provided to function"),
342                 libc::ERROR_NOTHING_TO_TERMINATE =>
343                     (InvalidInput, "no process to kill"),
344
345                 // libuv maps this error code to EISDIR. we do too. if it is found
346                 // to be incorrect, we can add in some more machinery to only
347                 // return this message when ERROR_INVALID_FUNCTION after certain
348                 // Windows calls.
349                 libc::ERROR_INVALID_FUNCTION => (InvalidInput,
350                                                  "illegal operation on a directory"),
351
352                 _ => (OtherIoError, "unknown error")
353             }
354         }
355
356         #[cfg(not(windows))]
357         fn get_err(errno: i32) -> (IoErrorKind, &'static str) {
358             // FIXME: this should probably be a bit more descriptive...
359             match errno {
360                 libc::EOF => (EndOfFile, "end of file"),
361                 libc::ECONNREFUSED => (ConnectionRefused, "connection refused"),
362                 libc::ECONNRESET => (ConnectionReset, "connection reset"),
363                 libc::EPERM | libc::EACCES =>
364                     (PermissionDenied, "permission denied"),
365                 libc::EPIPE => (BrokenPipe, "broken pipe"),
366                 libc::ENOTCONN => (NotConnected, "not connected"),
367                 libc::ECONNABORTED => (ConnectionAborted, "connection aborted"),
368                 libc::EADDRNOTAVAIL => (ConnectionRefused, "address not available"),
369                 libc::EADDRINUSE => (ConnectionRefused, "address in use"),
370                 libc::ENOENT => (FileNotFound, "no such file or directory"),
371                 libc::EISDIR => (InvalidInput, "illegal operation on a directory"),
372                 libc::ENOSYS => (IoUnavailable, "function not implemented"),
373                 libc::EINVAL => (InvalidInput, "invalid argument"),
374                 libc::ENOTTY =>
375                     (MismatchedFileTypeForOperation,
376                      "file descriptor is not a TTY"),
377                 libc::ETIMEDOUT => (TimedOut, "operation timed out"),
378                 libc::ECANCELED => (TimedOut, "operation aborted"),
379
380                 // These two constants can have the same value on some systems,
381                 // but different values on others, so we can't use a match
382                 // clause
383                 x if x == libc::EAGAIN || x == libc::EWOULDBLOCK =>
384                     (ResourceUnavailable, "resource temporarily unavailable"),
385
386                 _ => (OtherIoError, "unknown error")
387             }
388         }
389
390         let (kind, desc) = get_err(errno as i32);
391         IoError {
392             kind: kind,
393             desc: desc,
394             detail: if detail && kind == OtherIoError {
395                 Some(os::error_string(errno).as_slice().chars().map(|c| c.to_lowercase()).collect())
396             } else {
397                 None
398             },
399         }
400     }
401
402     /// Retrieve the last error to occur as a (detailed) IoError.
403     ///
404     /// This uses the OS `errno`, and so there should not be any task
405     /// descheduling or migration (other than that performed by the
406     /// operating system) between the call(s) for which errors are
407     /// being checked and the call of this function.
408     pub fn last_error() -> IoError {
409         IoError::from_errno(os::errno() as uint, true)
410     }
411
412     fn from_rtio_error(err: rtio::IoError) -> IoError {
413         let rtio::IoError { code, extra, detail } = err;
414         let mut ioerr = IoError::from_errno(code, false);
415         ioerr.detail = detail;
416         ioerr.kind = match ioerr.kind {
417             TimedOut if extra > 0 => ShortWrite(extra),
418             k => k,
419         };
420         return ioerr;
421     }
422 }
423
424 impl fmt::Show for IoError {
425     fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
426         match *self {
427             IoError { kind: OtherIoError, desc: "unknown error", detail: Some(ref detail) } =>
428                 write!(fmt, "{}", detail),
429             IoError { detail: None, desc, .. } =>
430                 write!(fmt, "{}", desc),
431             IoError { detail: Some(ref detail), desc, .. } =>
432                 write!(fmt, "{} ({})", desc, detail)
433         }
434     }
435 }
436
437 /// A list specifying general categories of I/O error.
438 #[deriving(PartialEq, Eq, Clone, Show)]
439 pub enum IoErrorKind {
440     /// Any I/O error not part of this list.
441     OtherIoError,
442     /// The operation could not complete because end of file was reached.
443     EndOfFile,
444     /// The file was not found.
445     FileNotFound,
446     /// The file permissions disallowed access to this file.
447     PermissionDenied,
448     /// A network connection failed for some reason not specified in this list.
449     ConnectionFailed,
450     /// The network operation failed because the network connection was closed.
451     Closed,
452     /// The connection was refused by the remote server.
453     ConnectionRefused,
454     /// The connection was reset by the remote server.
455     ConnectionReset,
456     /// The connection was aborted (terminated) by the remote server.
457     ConnectionAborted,
458     /// The network operation failed because it was not connected yet.
459     NotConnected,
460     /// The operation failed because a pipe was closed.
461     BrokenPipe,
462     /// A file already existed with that name.
463     PathAlreadyExists,
464     /// No file exists at that location.
465     PathDoesntExist,
466     /// The path did not specify the type of file that this operation required. For example,
467     /// attempting to copy a directory with the `fs::copy()` operation will fail with this error.
468     MismatchedFileTypeForOperation,
469     /// The operation temporarily failed (for example, because a signal was received), and retrying
470     /// may succeed.
471     ResourceUnavailable,
472     /// No I/O functionality is available for this task.
473     IoUnavailable,
474     /// A parameter was incorrect in a way that caused an I/O error not part of this list.
475     InvalidInput,
476     /// The I/O operation's timeout expired, causing it to be canceled.
477     TimedOut,
478     /// This write operation failed to write all of its data.
479     ///
480     /// Normally the write() method on a Writer guarantees that all of its data
481     /// has been written, but some operations may be terminated after only
482     /// partially writing some data. An example of this is a timed out write
483     /// which successfully wrote a known number of bytes, but bailed out after
484     /// doing so.
485     ///
486     /// The payload contained as part of this variant is the number of bytes
487     /// which are known to have been successfully written.
488     ShortWrite(uint),
489     /// The Reader returned 0 bytes from `read()` too many times.
490     NoProgress,
491 }
492
493 /// A trait that lets you add a `detail` to an IoError easily
494 trait UpdateIoError<T> {
495     /// Returns an IoError with updated description and detail
496     fn update_err(self, desc: &'static str, detail: |&IoError| -> String) -> Self;
497
498     /// Returns an IoError with updated detail
499     fn update_detail(self, detail: |&IoError| -> String) -> Self;
500
501     /// Returns an IoError with update description
502     fn update_desc(self, desc: &'static str) -> Self;
503 }
504
505 impl<T> UpdateIoError<T> for IoResult<T> {
506     fn update_err(self, desc: &'static str, detail: |&IoError| -> String) -> IoResult<T> {
507         self.map_err(|mut e| {
508             let detail = detail(&e);
509             e.desc = desc;
510             e.detail = Some(detail);
511             e
512         })
513     }
514
515     fn update_detail(self, detail: |&IoError| -> String) -> IoResult<T> {
516         self.map_err(|mut e| { e.detail = Some(detail(&e)); e })
517     }
518
519     fn update_desc(self, desc: &'static str) -> IoResult<T> {
520         self.map_err(|mut e| { e.desc = desc; e })
521     }
522 }
523
524 static NO_PROGRESS_LIMIT: uint = 1000;
525
526 /// A trait for objects which are byte-oriented streams. Readers are defined by
527 /// one method, `read`. This function will block until data is available,
528 /// filling in the provided buffer with any data read.
529 ///
530 /// Readers are intended to be composable with one another. Many objects
531 /// throughout the I/O and related libraries take and provide types which
532 /// implement the `Reader` trait.
533 pub trait Reader {
534
535     // Only method which need to get implemented for this trait
536
537     /// Read bytes, up to the length of `buf` and place them in `buf`.
538     /// Returns the number of bytes read. The number of bytes read may
539     /// be less than the number requested, even 0. Returns `Err` on EOF.
540     ///
541     /// # Error
542     ///
543     /// If an error occurs during this I/O operation, then it is returned as
544     /// `Err(IoError)`. Note that end-of-file is considered an error, and can be
545     /// inspected for in the error's `kind` field. Also note that reading 0
546     /// bytes is not considered an error in all circumstances
547     ///
548     /// # Implementation Note
549     ///
550     /// When implementing this method on a new Reader, you are strongly encouraged
551     /// not to return 0 if you can avoid it.
552     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint>;
553
554     // Convenient helper methods based on the above methods
555
556     /// Reads at least `min` bytes and places them in `buf`.
557     /// Returns the number of bytes read.
558     ///
559     /// This will continue to call `read` until at least `min` bytes have been
560     /// read. If `read` returns 0 too many times, `NoProgress` will be
561     /// returned.
562     ///
563     /// # Error
564     ///
565     /// If an error occurs at any point, that error is returned, and no further
566     /// bytes are read.
567     fn read_at_least(&mut self, min: uint, buf: &mut [u8]) -> IoResult<uint> {
568         if min > buf.len() {
569             return Err(IoError {
570                 detail: Some(String::from_str("the buffer is too short")),
571                 ..standard_error(InvalidInput)
572             });
573         }
574         let mut read = 0;
575         while read < min {
576             let mut zeroes = 0;
577             loop {
578                 match self.read(buf[mut read..]) {
579                     Ok(0) => {
580                         zeroes += 1;
581                         if zeroes >= NO_PROGRESS_LIMIT {
582                             return Err(standard_error(NoProgress));
583                         }
584                     }
585                     Ok(n) => {
586                         read += n;
587                         break;
588                     }
589                     err@Err(_) => return err
590                 }
591             }
592         }
593         Ok(read)
594     }
595
596     /// Reads a single byte. Returns `Err` on EOF.
597     fn read_byte(&mut self) -> IoResult<u8> {
598         let mut buf = [0];
599         try!(self.read_at_least(1, buf));
600         Ok(buf[0])
601     }
602
603     /// Reads up to `len` bytes and appends them to a vector.
604     /// Returns the number of bytes read. The number of bytes read may be
605     /// less than the number requested, even 0. Returns Err on EOF.
606     ///
607     /// # Error
608     ///
609     /// If an error occurs during this I/O operation, then it is returned
610     /// as `Err(IoError)`. See `read()` for more details.
611     fn push(&mut self, len: uint, buf: &mut Vec<u8>) -> IoResult<uint> {
612         let start_len = buf.len();
613         buf.reserve_additional(len);
614
615         let n = {
616             let s = unsafe { slice_vec_capacity(buf, start_len, start_len + len) };
617             try!(self.read(s))
618         };
619         unsafe { buf.set_len(start_len + n) };
620         Ok(n)
621     }
622
623     /// Reads at least `min` bytes, but no more than `len`, and appends them to
624     /// a vector.
625     /// Returns the number of bytes read.
626     ///
627     /// This will continue to call `read` until at least `min` bytes have been
628     /// read. If `read` returns 0 too many times, `NoProgress` will be
629     /// returned.
630     ///
631     /// # Error
632     ///
633     /// If an error occurs at any point, that error is returned, and no further
634     /// bytes are read.
635     fn push_at_least(&mut self, min: uint, len: uint, buf: &mut Vec<u8>) -> IoResult<uint> {
636         if min > len {
637             return Err(IoError {
638                 detail: Some(String::from_str("the buffer is too short")),
639                 ..standard_error(InvalidInput)
640             });
641         }
642
643         let start_len = buf.len();
644         buf.reserve_additional(len);
645
646         // we can't just use self.read_at_least(min, slice) because we need to push
647         // successful reads onto the vector before any returned errors.
648
649         let mut read = 0;
650         while read < min {
651             read += {
652                 let s = unsafe { slice_vec_capacity(buf, start_len + read, start_len + len) };
653                 try!(self.read_at_least(1, s))
654             };
655             unsafe { buf.set_len(start_len + read) };
656         }
657         Ok(read)
658     }
659
660     /// Reads exactly `len` bytes and gives you back a new vector of length
661     /// `len`
662     ///
663     /// # Error
664     ///
665     /// Fails with the same conditions as `read`. Additionally returns error
666     /// on EOF. Note that if an error is returned, then some number of bytes may
667     /// have already been consumed from the underlying reader, and they are lost
668     /// (not returned as part of the error). If this is unacceptable, then it is
669     /// recommended to use the `push_at_least` or `read` methods.
670     fn read_exact(&mut self, len: uint) -> IoResult<Vec<u8>> {
671         let mut buf = Vec::with_capacity(len);
672         match self.push_at_least(len, len, &mut buf) {
673             Ok(_) => Ok(buf),
674             Err(e) => Err(e),
675         }
676     }
677
678     /// Reads all remaining bytes from the stream.
679     ///
680     /// # Error
681     ///
682     /// Returns any non-EOF error immediately. Previously read bytes are
683     /// discarded when an error is returned.
684     ///
685     /// When EOF is encountered, all bytes read up to that point are returned.
686     fn read_to_end(&mut self) -> IoResult<Vec<u8>> {
687         let mut buf = Vec::with_capacity(DEFAULT_BUF_SIZE);
688         loop {
689             match self.push_at_least(1, DEFAULT_BUF_SIZE, &mut buf) {
690                 Ok(_) => {}
691                 Err(ref e) if e.kind == EndOfFile => break,
692                 Err(e) => return Err(e)
693             }
694         }
695         return Ok(buf);
696     }
697
698     /// Reads all of the remaining bytes of this stream, interpreting them as a
699     /// UTF-8 encoded stream. The corresponding string is returned.
700     ///
701     /// # Error
702     ///
703     /// This function returns all of the same errors as `read_to_end` with an
704     /// additional error if the reader's contents are not a valid sequence of
705     /// UTF-8 bytes.
706     fn read_to_string(&mut self) -> IoResult<String> {
707         self.read_to_end().and_then(|s| {
708             match String::from_utf8(s) {
709                 Ok(s)  => Ok(s),
710                 Err(_) => Err(standard_error(InvalidInput)),
711             }
712         })
713     }
714
715     /// Create an iterator that reads a single byte on
716     /// each iteration, until EOF.
717     ///
718     /// # Error
719     ///
720     /// Any error other than `EndOfFile` that is produced by the underlying Reader
721     /// is returned by the iterator and should be handled by the caller.
722     fn bytes<'r>(&'r mut self) -> extensions::Bytes<'r, Self> {
723         extensions::Bytes::new(self)
724     }
725
726     // Byte conversion helpers
727
728     /// Reads `n` little-endian unsigned integer bytes.
729     ///
730     /// `n` must be between 1 and 8, inclusive.
731     fn read_le_uint_n(&mut self, nbytes: uint) -> IoResult<u64> {
732         assert!(nbytes > 0 && nbytes <= 8);
733
734         let mut val = 0u64;
735         let mut pos = 0;
736         let mut i = nbytes;
737         while i > 0 {
738             val += (try!(self.read_u8()) as u64) << pos;
739             pos += 8;
740             i -= 1;
741         }
742         Ok(val)
743     }
744
745     /// Reads `n` little-endian signed integer bytes.
746     ///
747     /// `n` must be between 1 and 8, inclusive.
748     fn read_le_int_n(&mut self, nbytes: uint) -> IoResult<i64> {
749         self.read_le_uint_n(nbytes).map(|i| extend_sign(i, nbytes))
750     }
751
752     /// Reads `n` big-endian unsigned integer bytes.
753     ///
754     /// `n` must be between 1 and 8, inclusive.
755     fn read_be_uint_n(&mut self, nbytes: uint) -> IoResult<u64> {
756         assert!(nbytes > 0 && nbytes <= 8);
757
758         let mut val = 0u64;
759         let mut i = nbytes;
760         while i > 0 {
761             i -= 1;
762             val += (try!(self.read_u8()) as u64) << i * 8;
763         }
764         Ok(val)
765     }
766
767     /// Reads `n` big-endian signed integer bytes.
768     ///
769     /// `n` must be between 1 and 8, inclusive.
770     fn read_be_int_n(&mut self, nbytes: uint) -> IoResult<i64> {
771         self.read_be_uint_n(nbytes).map(|i| extend_sign(i, nbytes))
772     }
773
774     /// Reads a little-endian unsigned integer.
775     ///
776     /// The number of bytes returned is system-dependent.
777     fn read_le_uint(&mut self) -> IoResult<uint> {
778         self.read_le_uint_n(uint::BYTES).map(|i| i as uint)
779     }
780
781     /// Reads a little-endian integer.
782     ///
783     /// The number of bytes returned is system-dependent.
784     fn read_le_int(&mut self) -> IoResult<int> {
785         self.read_le_int_n(int::BYTES).map(|i| i as int)
786     }
787
788     /// Reads a big-endian unsigned integer.
789     ///
790     /// The number of bytes returned is system-dependent.
791     fn read_be_uint(&mut self) -> IoResult<uint> {
792         self.read_be_uint_n(uint::BYTES).map(|i| i as uint)
793     }
794
795     /// Reads a big-endian integer.
796     ///
797     /// The number of bytes returned is system-dependent.
798     fn read_be_int(&mut self) -> IoResult<int> {
799         self.read_be_int_n(int::BYTES).map(|i| i as int)
800     }
801
802     /// Reads a big-endian `u64`.
803     ///
804     /// `u64`s are 8 bytes long.
805     fn read_be_u64(&mut self) -> IoResult<u64> {
806         self.read_be_uint_n(8)
807     }
808
809     /// Reads a big-endian `u32`.
810     ///
811     /// `u32`s are 4 bytes long.
812     fn read_be_u32(&mut self) -> IoResult<u32> {
813         self.read_be_uint_n(4).map(|i| i as u32)
814     }
815
816     /// Reads a big-endian `u16`.
817     ///
818     /// `u16`s are 2 bytes long.
819     fn read_be_u16(&mut self) -> IoResult<u16> {
820         self.read_be_uint_n(2).map(|i| i as u16)
821     }
822
823     /// Reads a big-endian `i64`.
824     ///
825     /// `i64`s are 8 bytes long.
826     fn read_be_i64(&mut self) -> IoResult<i64> {
827         self.read_be_int_n(8)
828     }
829
830     /// Reads a big-endian `i32`.
831     ///
832     /// `i32`s are 4 bytes long.
833     fn read_be_i32(&mut self) -> IoResult<i32> {
834         self.read_be_int_n(4).map(|i| i as i32)
835     }
836
837     /// Reads a big-endian `i16`.
838     ///
839     /// `i16`s are 2 bytes long.
840     fn read_be_i16(&mut self) -> IoResult<i16> {
841         self.read_be_int_n(2).map(|i| i as i16)
842     }
843
844     /// Reads a big-endian `f64`.
845     ///
846     /// `f64`s are 8 byte, IEEE754 double-precision floating point numbers.
847     fn read_be_f64(&mut self) -> IoResult<f64> {
848         self.read_be_u64().map(|i| unsafe {
849             transmute::<u64, f64>(i)
850         })
851     }
852
853     /// Reads a big-endian `f32`.
854     ///
855     /// `f32`s are 4 byte, IEEE754 single-precision floating point numbers.
856     fn read_be_f32(&mut self) -> IoResult<f32> {
857         self.read_be_u32().map(|i| unsafe {
858             transmute::<u32, f32>(i)
859         })
860     }
861
862     /// Reads a little-endian `u64`.
863     ///
864     /// `u64`s are 8 bytes long.
865     fn read_le_u64(&mut self) -> IoResult<u64> {
866         self.read_le_uint_n(8)
867     }
868
869     /// Reads a little-endian `u32`.
870     ///
871     /// `u32`s are 4 bytes long.
872     fn read_le_u32(&mut self) -> IoResult<u32> {
873         self.read_le_uint_n(4).map(|i| i as u32)
874     }
875
876     /// Reads a little-endian `u16`.
877     ///
878     /// `u16`s are 2 bytes long.
879     fn read_le_u16(&mut self) -> IoResult<u16> {
880         self.read_le_uint_n(2).map(|i| i as u16)
881     }
882
883     /// Reads a little-endian `i64`.
884     ///
885     /// `i64`s are 8 bytes long.
886     fn read_le_i64(&mut self) -> IoResult<i64> {
887         self.read_le_int_n(8)
888     }
889
890     /// Reads a little-endian `i32`.
891     ///
892     /// `i32`s are 4 bytes long.
893     fn read_le_i32(&mut self) -> IoResult<i32> {
894         self.read_le_int_n(4).map(|i| i as i32)
895     }
896
897     /// Reads a little-endian `i16`.
898     ///
899     /// `i16`s are 2 bytes long.
900     fn read_le_i16(&mut self) -> IoResult<i16> {
901         self.read_le_int_n(2).map(|i| i as i16)
902     }
903
904     /// Reads a little-endian `f64`.
905     ///
906     /// `f64`s are 8 byte, IEEE754 double-precision floating point numbers.
907     fn read_le_f64(&mut self) -> IoResult<f64> {
908         self.read_le_u64().map(|i| unsafe {
909             transmute::<u64, f64>(i)
910         })
911     }
912
913     /// Reads a little-endian `f32`.
914     ///
915     /// `f32`s are 4 byte, IEEE754 single-precision floating point numbers.
916     fn read_le_f32(&mut self) -> IoResult<f32> {
917         self.read_le_u32().map(|i| unsafe {
918             transmute::<u32, f32>(i)
919         })
920     }
921
922     /// Read a u8.
923     ///
924     /// `u8`s are 1 byte.
925     fn read_u8(&mut self) -> IoResult<u8> {
926         self.read_byte()
927     }
928
929     /// Read an i8.
930     ///
931     /// `i8`s are 1 byte.
932     fn read_i8(&mut self) -> IoResult<i8> {
933         self.read_byte().map(|i| i as i8)
934     }
935
936     /// Creates a wrapper around a mutable reference to the reader.
937     ///
938     /// This is useful to allow applying adaptors while still
939     /// retaining ownership of the original value.
940     fn by_ref<'a>(&'a mut self) -> RefReader<'a, Self> {
941         RefReader { inner: self }
942     }
943 }
944
945 impl<'a> Reader for Box<Reader+'a> {
946     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
947         let reader: &mut Reader = &mut **self;
948         reader.read(buf)
949     }
950 }
951
952 impl<'a> Reader for &'a mut Reader+'a {
953     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> { (*self).read(buf) }
954 }
955
956 /// Returns a slice of `v` between `start` and `end`.
957 ///
958 /// Similar to `slice()` except this function only bounds the slice on the
959 /// capacity of `v`, not the length.
960 ///
961 /// # Failure
962 ///
963 /// Fails when `start` or `end` point outside the capacity of `v`, or when
964 /// `start` > `end`.
965 // Private function here because we aren't sure if we want to expose this as
966 // API yet. If so, it should be a method on Vec.
967 unsafe fn slice_vec_capacity<'a, T>(v: &'a mut Vec<T>, start: uint, end: uint) -> &'a mut [T] {
968     use raw::Slice;
969     use ptr::RawPtr;
970
971     assert!(start <= end);
972     assert!(end <= v.capacity());
973     transmute(Slice {
974         data: v.as_ptr().offset(start as int),
975         len: end - start
976     })
977 }
978
979 /// A `RefReader` is a struct implementing `Reader` which contains a reference
980 /// to another reader. This is often useful when composing streams.
981 ///
982 /// # Example
983 ///
984 /// ```
985 /// # fn main() {}
986 /// # fn process_input<R: Reader>(r: R) {}
987 /// # fn foo() {
988 /// use std::io;
989 /// use std::io::util::LimitReader;
990 ///
991 /// let mut stream = io::stdin();
992 ///
993 /// // Only allow the function to process at most one kilobyte of input
994 /// {
995 ///     let stream = LimitReader::new(stream.by_ref(), 1024);
996 ///     process_input(stream);
997 /// }
998 ///
999 /// // 'stream' is still available for use here
1000 ///
1001 /// # }
1002 /// ```
1003 pub struct RefReader<'a, R:'a> {
1004     /// The underlying reader which this is referencing
1005     inner: &'a mut R
1006 }
1007
1008 impl<'a, R: Reader> Reader for RefReader<'a, R> {
1009     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> { self.inner.read(buf) }
1010 }
1011
1012 impl<'a, R: Buffer> Buffer for RefReader<'a, R> {
1013     fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> { self.inner.fill_buf() }
1014     fn consume(&mut self, amt: uint) { self.inner.consume(amt) }
1015 }
1016
1017 fn extend_sign(val: u64, nbytes: uint) -> i64 {
1018     let shift = (8 - nbytes) * 8;
1019     (val << shift) as i64 >> shift
1020 }
1021
1022 /// A trait for objects which are byte-oriented streams. Writers are defined by
1023 /// one method, `write`. This function will block until the provided buffer of
1024 /// bytes has been entirely written, and it will return any failures which occur.
1025 ///
1026 /// Another commonly overridden method is the `flush` method for writers such as
1027 /// buffered writers.
1028 ///
1029 /// Writers are intended to be composable with one another. Many objects
1030 /// throughout the I/O and related libraries take and provide types which
1031 /// implement the `Writer` trait.
1032 pub trait Writer {
1033     /// Write the entirety of a given buffer
1034     ///
1035     /// # Errors
1036     ///
1037     /// If an error happens during the I/O operation, the error is returned as
1038     /// `Err`. Note that it is considered an error if the entire buffer could
1039     /// not be written, and if an error is returned then it is unknown how much
1040     /// data (if any) was actually written.
1041     fn write(&mut self, buf: &[u8]) -> IoResult<()>;
1042
1043     /// Flush this output stream, ensuring that all intermediately buffered
1044     /// contents reach their destination.
1045     ///
1046     /// This is by default a no-op and implementers of the `Writer` trait should
1047     /// decide whether their stream needs to be buffered or not.
1048     fn flush(&mut self) -> IoResult<()> { Ok(()) }
1049
1050     /// Writes a formatted string into this writer, returning any error
1051     /// encountered.
1052     ///
1053     /// This method is primarily used to interface with the `format_args!`
1054     /// macro, but it is rare that this should explicitly be called. The
1055     /// `write!` macro should be favored to invoke this method instead.
1056     ///
1057     /// # Errors
1058     ///
1059     /// This function will return any I/O error reported while formatting.
1060     fn write_fmt(&mut self, fmt: &fmt::Arguments) -> IoResult<()> {
1061         // Create a shim which translates a Writer to a FormatWriter and saves
1062         // off I/O errors. instead of discarding them
1063         struct Adaptor<'a, T:'a> {
1064             inner: &'a mut T,
1065             error: IoResult<()>,
1066         }
1067
1068         impl<'a, T: Writer> fmt::FormatWriter for Adaptor<'a, T> {
1069             fn write(&mut self, bytes: &[u8]) -> fmt::Result {
1070                 match self.inner.write(bytes) {
1071                     Ok(()) => Ok(()),
1072                     Err(e) => {
1073                         self.error = Err(e);
1074                         Err(fmt::WriteError)
1075                     }
1076                 }
1077             }
1078         }
1079
1080         let mut output = Adaptor { inner: self, error: Ok(()) };
1081         match fmt::write(&mut output, fmt) {
1082             Ok(()) => Ok(()),
1083             Err(..) => output.error
1084         }
1085     }
1086
1087     /// Write a rust string into this sink.
1088     ///
1089     /// The bytes written will be the UTF-8 encoded version of the input string.
1090     /// If other encodings are desired, it is recommended to compose this stream
1091     /// with another performing the conversion, or to use `write` with a
1092     /// converted byte-array instead.
1093     #[inline]
1094     fn write_str(&mut self, s: &str) -> IoResult<()> {
1095         self.write(s.as_bytes())
1096     }
1097
1098     /// Writes a string into this sink, and then writes a literal newline (`\n`)
1099     /// byte afterwards. Note that the writing of the newline is *not* atomic in
1100     /// the sense that the call to `write` is invoked twice (once with the
1101     /// string and once with a newline character).
1102     ///
1103     /// If other encodings or line ending flavors are desired, it is recommended
1104     /// that the `write` method is used specifically instead.
1105     #[inline]
1106     fn write_line(&mut self, s: &str) -> IoResult<()> {
1107         self.write_str(s).and_then(|()| self.write([b'\n']))
1108     }
1109
1110     /// Write a single char, encoded as UTF-8.
1111     #[inline]
1112     fn write_char(&mut self, c: char) -> IoResult<()> {
1113         let mut buf = [0u8, ..4];
1114         let n = c.encode_utf8(buf[mut]).unwrap_or(0);
1115         self.write(buf[..n])
1116     }
1117
1118     /// Write the result of passing n through `int::to_str_bytes`.
1119     #[inline]
1120     fn write_int(&mut self, n: int) -> IoResult<()> {
1121         write!(self, "{:d}", n)
1122     }
1123
1124     /// Write the result of passing n through `uint::to_str_bytes`.
1125     #[inline]
1126     fn write_uint(&mut self, n: uint) -> IoResult<()> {
1127         write!(self, "{:u}", n)
1128     }
1129
1130     /// Write a little-endian uint (number of bytes depends on system).
1131     #[inline]
1132     fn write_le_uint(&mut self, n: uint) -> IoResult<()> {
1133         extensions::u64_to_le_bytes(n as u64, uint::BYTES, |v| self.write(v))
1134     }
1135
1136     /// Write a little-endian int (number of bytes depends on system).
1137     #[inline]
1138     fn write_le_int(&mut self, n: int) -> IoResult<()> {
1139         extensions::u64_to_le_bytes(n as u64, int::BYTES, |v| self.write(v))
1140     }
1141
1142     /// Write a big-endian uint (number of bytes depends on system).
1143     #[inline]
1144     fn write_be_uint(&mut self, n: uint) -> IoResult<()> {
1145         extensions::u64_to_be_bytes(n as u64, uint::BYTES, |v| self.write(v))
1146     }
1147
1148     /// Write a big-endian int (number of bytes depends on system).
1149     #[inline]
1150     fn write_be_int(&mut self, n: int) -> IoResult<()> {
1151         extensions::u64_to_be_bytes(n as u64, int::BYTES, |v| self.write(v))
1152     }
1153
1154     /// Write a big-endian u64 (8 bytes).
1155     #[inline]
1156     fn write_be_u64(&mut self, n: u64) -> IoResult<()> {
1157         extensions::u64_to_be_bytes(n, 8u, |v| self.write(v))
1158     }
1159
1160     /// Write a big-endian u32 (4 bytes).
1161     #[inline]
1162     fn write_be_u32(&mut self, n: u32) -> IoResult<()> {
1163         extensions::u64_to_be_bytes(n as u64, 4u, |v| self.write(v))
1164     }
1165
1166     /// Write a big-endian u16 (2 bytes).
1167     #[inline]
1168     fn write_be_u16(&mut self, n: u16) -> IoResult<()> {
1169         extensions::u64_to_be_bytes(n as u64, 2u, |v| self.write(v))
1170     }
1171
1172     /// Write a big-endian i64 (8 bytes).
1173     #[inline]
1174     fn write_be_i64(&mut self, n: i64) -> IoResult<()> {
1175         extensions::u64_to_be_bytes(n as u64, 8u, |v| self.write(v))
1176     }
1177
1178     /// Write a big-endian i32 (4 bytes).
1179     #[inline]
1180     fn write_be_i32(&mut self, n: i32) -> IoResult<()> {
1181         extensions::u64_to_be_bytes(n as u64, 4u, |v| self.write(v))
1182     }
1183
1184     /// Write a big-endian i16 (2 bytes).
1185     #[inline]
1186     fn write_be_i16(&mut self, n: i16) -> IoResult<()> {
1187         extensions::u64_to_be_bytes(n as u64, 2u, |v| self.write(v))
1188     }
1189
1190     /// Write a big-endian IEEE754 double-precision floating-point (8 bytes).
1191     #[inline]
1192     fn write_be_f64(&mut self, f: f64) -> IoResult<()> {
1193         unsafe {
1194             self.write_be_u64(transmute(f))
1195         }
1196     }
1197
1198     /// Write a big-endian IEEE754 single-precision floating-point (4 bytes).
1199     #[inline]
1200     fn write_be_f32(&mut self, f: f32) -> IoResult<()> {
1201         unsafe {
1202             self.write_be_u32(transmute(f))
1203         }
1204     }
1205
1206     /// Write a little-endian u64 (8 bytes).
1207     #[inline]
1208     fn write_le_u64(&mut self, n: u64) -> IoResult<()> {
1209         extensions::u64_to_le_bytes(n, 8u, |v| self.write(v))
1210     }
1211
1212     /// Write a little-endian u32 (4 bytes).
1213     #[inline]
1214     fn write_le_u32(&mut self, n: u32) -> IoResult<()> {
1215         extensions::u64_to_le_bytes(n as u64, 4u, |v| self.write(v))
1216     }
1217
1218     /// Write a little-endian u16 (2 bytes).
1219     #[inline]
1220     fn write_le_u16(&mut self, n: u16) -> IoResult<()> {
1221         extensions::u64_to_le_bytes(n as u64, 2u, |v| self.write(v))
1222     }
1223
1224     /// Write a little-endian i64 (8 bytes).
1225     #[inline]
1226     fn write_le_i64(&mut self, n: i64) -> IoResult<()> {
1227         extensions::u64_to_le_bytes(n as u64, 8u, |v| self.write(v))
1228     }
1229
1230     /// Write a little-endian i32 (4 bytes).
1231     #[inline]
1232     fn write_le_i32(&mut self, n: i32) -> IoResult<()> {
1233         extensions::u64_to_le_bytes(n as u64, 4u, |v| self.write(v))
1234     }
1235
1236     /// Write a little-endian i16 (2 bytes).
1237     #[inline]
1238     fn write_le_i16(&mut self, n: i16) -> IoResult<()> {
1239         extensions::u64_to_le_bytes(n as u64, 2u, |v| self.write(v))
1240     }
1241
1242     /// Write a little-endian IEEE754 double-precision floating-point
1243     /// (8 bytes).
1244     #[inline]
1245     fn write_le_f64(&mut self, f: f64) -> IoResult<()> {
1246         unsafe {
1247             self.write_le_u64(transmute(f))
1248         }
1249     }
1250
1251     /// Write a little-endian IEEE754 single-precision floating-point
1252     /// (4 bytes).
1253     #[inline]
1254     fn write_le_f32(&mut self, f: f32) -> IoResult<()> {
1255         unsafe {
1256             self.write_le_u32(transmute(f))
1257         }
1258     }
1259
1260     /// Write a u8 (1 byte).
1261     #[inline]
1262     fn write_u8(&mut self, n: u8) -> IoResult<()> {
1263         self.write([n])
1264     }
1265
1266     /// Write an i8 (1 byte).
1267     #[inline]
1268     fn write_i8(&mut self, n: i8) -> IoResult<()> {
1269         self.write([n as u8])
1270     }
1271
1272     /// Creates a wrapper around a mutable reference to the writer.
1273     ///
1274     /// This is useful to allow applying wrappers while still
1275     /// retaining ownership of the original value.
1276     #[inline]
1277     fn by_ref<'a>(&'a mut self) -> RefWriter<'a, Self> {
1278         RefWriter { inner: self }
1279     }
1280 }
1281
1282 impl<'a> Writer for Box<Writer+'a> {
1283     #[inline]
1284     fn write(&mut self, buf: &[u8]) -> IoResult<()> {
1285         (&mut **self).write(buf)
1286     }
1287
1288     #[inline]
1289     fn flush(&mut self) -> IoResult<()> {
1290         (&mut **self).flush()
1291     }
1292 }
1293
1294 impl<'a> Writer for &'a mut Writer+'a {
1295     #[inline]
1296     fn write(&mut self, buf: &[u8]) -> IoResult<()> { (**self).write(buf) }
1297
1298     #[inline]
1299     fn flush(&mut self) -> IoResult<()> { (**self).flush() }
1300 }
1301
1302 /// A `RefWriter` is a struct implementing `Writer` which contains a reference
1303 /// to another writer. This is often useful when composing streams.
1304 ///
1305 /// # Example
1306 ///
1307 /// ```
1308 /// # fn main() {}
1309 /// # fn process_input<R: Reader>(r: R) {}
1310 /// # fn foo () {
1311 /// use std::io::util::TeeReader;
1312 /// use std::io::{stdin, MemWriter};
1313 ///
1314 /// let mut output = MemWriter::new();
1315 ///
1316 /// {
1317 ///     // Don't give ownership of 'output' to the 'tee'. Instead we keep a
1318 ///     // handle to it in the outer scope
1319 ///     let mut tee = TeeReader::new(stdin(), output.by_ref());
1320 ///     process_input(tee);
1321 /// }
1322 ///
1323 /// println!("input processed: {}", output.unwrap());
1324 /// # }
1325 /// ```
1326 pub struct RefWriter<'a, W:'a> {
1327     /// The underlying writer which this is referencing
1328     inner: &'a mut W
1329 }
1330
1331 impl<'a, W: Writer> Writer for RefWriter<'a, W> {
1332     #[inline]
1333     fn write(&mut self, buf: &[u8]) -> IoResult<()> { self.inner.write(buf) }
1334
1335     #[inline]
1336     fn flush(&mut self) -> IoResult<()> { self.inner.flush() }
1337 }
1338
1339
1340 /// A Stream is a readable and a writable object. Data written is typically
1341 /// received by the object which reads receive data from.
1342 pub trait Stream: Reader + Writer { }
1343
1344 impl<T: Reader + Writer> Stream for T {}
1345
1346 /// An iterator that reads a line on each iteration,
1347 /// until `.read_line()` encounters `EndOfFile`.
1348 ///
1349 /// # Notes about the Iteration Protocol
1350 ///
1351 /// The `Lines` may yield `None` and thus terminate
1352 /// an iteration, but continue to yield elements if iteration
1353 /// is attempted again.
1354 ///
1355 /// # Error
1356 ///
1357 /// Any error other than `EndOfFile` that is produced by the underlying Reader
1358 /// is returned by the iterator and should be handled by the caller.
1359 pub struct Lines<'r, T:'r> {
1360     buffer: &'r mut T,
1361 }
1362
1363 impl<'r, T: Buffer> Iterator<IoResult<String>> for Lines<'r, T> {
1364     fn next(&mut self) -> Option<IoResult<String>> {
1365         match self.buffer.read_line() {
1366             Ok(x) => Some(Ok(x)),
1367             Err(IoError { kind: EndOfFile, ..}) => None,
1368             Err(y) => Some(Err(y))
1369         }
1370     }
1371 }
1372
1373 /// An iterator that reads a utf8-encoded character on each iteration,
1374 /// until `.read_char()` encounters `EndOfFile`.
1375 ///
1376 /// # Notes about the Iteration Protocol
1377 ///
1378 /// The `Chars` may yield `None` and thus terminate
1379 /// an iteration, but continue to yield elements if iteration
1380 /// is attempted again.
1381 ///
1382 /// # Error
1383 ///
1384 /// Any error other than `EndOfFile` that is produced by the underlying Reader
1385 /// is returned by the iterator and should be handled by the caller.
1386 pub struct Chars<'r, T:'r> {
1387     buffer: &'r mut T
1388 }
1389
1390 impl<'r, T: Buffer> Iterator<IoResult<char>> for Chars<'r, T> {
1391     fn next(&mut self) -> Option<IoResult<char>> {
1392         match self.buffer.read_char() {
1393             Ok(x) => Some(Ok(x)),
1394             Err(IoError { kind: EndOfFile, ..}) => None,
1395             Err(y) => Some(Err(y))
1396         }
1397     }
1398 }
1399
1400 /// A Buffer is a type of reader which has some form of internal buffering to
1401 /// allow certain kinds of reading operations to be more optimized than others.
1402 /// This type extends the `Reader` trait with a few methods that are not
1403 /// possible to reasonably implement with purely a read interface.
1404 pub trait Buffer: Reader {
1405     /// Fills the internal buffer of this object, returning the buffer contents.
1406     /// Note that none of the contents will be "read" in the sense that later
1407     /// calling `read` may return the same contents.
1408     ///
1409     /// The `consume` function must be called with the number of bytes that are
1410     /// consumed from this buffer returned to ensure that the bytes are never
1411     /// returned twice.
1412     ///
1413     /// # Error
1414     ///
1415     /// This function will return an I/O error if the underlying reader was
1416     /// read, but returned an error. Note that it is not an error to return a
1417     /// 0-length buffer.
1418     fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]>;
1419
1420     /// Tells this buffer that `amt` bytes have been consumed from the buffer,
1421     /// so they should no longer be returned in calls to `read`.
1422     fn consume(&mut self, amt: uint);
1423
1424     /// Reads the next line of input, interpreted as a sequence of UTF-8
1425     /// encoded Unicode codepoints. If a newline is encountered, then the
1426     /// newline is contained in the returned string.
1427     ///
1428     /// # Example
1429     ///
1430     /// ```rust
1431     /// use std::io;
1432     ///
1433     /// let mut reader = io::stdin();
1434     /// let input = reader.read_line().ok().unwrap_or("nothing".to_string());
1435     /// ```
1436     ///
1437     /// # Error
1438     ///
1439     /// This function has the same error semantics as `read_until`:
1440     ///
1441     /// * All non-EOF errors will be returned immediately
1442     /// * If an error is returned previously consumed bytes are lost
1443     /// * EOF is only returned if no bytes have been read
1444     /// * Reach EOF may mean that the delimiter is not present in the return
1445     ///   value
1446     ///
1447     /// Additionally, this function can fail if the line of input read is not a
1448     /// valid UTF-8 sequence of bytes.
1449     fn read_line(&mut self) -> IoResult<String> {
1450         self.read_until(b'\n').and_then(|line|
1451             match String::from_utf8(line) {
1452                 Ok(s)  => Ok(s),
1453                 Err(_) => Err(standard_error(InvalidInput)),
1454             }
1455         )
1456     }
1457
1458     /// Create an iterator that reads a line on each iteration until EOF.
1459     ///
1460     /// # Error
1461     ///
1462     /// Any error other than `EndOfFile` that is produced by the underlying Reader
1463     /// is returned by the iterator and should be handled by the caller.
1464     fn lines<'r>(&'r mut self) -> Lines<'r, Self> {
1465         Lines { buffer: self }
1466     }
1467
1468     /// Reads a sequence of bytes leading up to a specified delimiter. Once the
1469     /// specified byte is encountered, reading ceases and the bytes up to and
1470     /// including the delimiter are returned.
1471     ///
1472     /// # Error
1473     ///
1474     /// If any I/O error is encountered other than EOF, the error is immediately
1475     /// returned. Note that this may discard bytes which have already been read,
1476     /// and those bytes will *not* be returned. It is recommended to use other
1477     /// methods if this case is worrying.
1478     ///
1479     /// If EOF is encountered, then this function will return EOF if 0 bytes
1480     /// have been read, otherwise the pending byte buffer is returned. This
1481     /// is the reason that the byte buffer returned may not always contain the
1482     /// delimiter.
1483     fn read_until(&mut self, byte: u8) -> IoResult<Vec<u8>> {
1484         let mut res = Vec::new();
1485
1486         let mut used;
1487         loop {
1488             {
1489                 let available = match self.fill_buf() {
1490                     Ok(n) => n,
1491                     Err(ref e) if res.len() > 0 && e.kind == EndOfFile => {
1492                         used = 0;
1493                         break
1494                     }
1495                     Err(e) => return Err(e)
1496                 };
1497                 match available.iter().position(|&b| b == byte) {
1498                     Some(i) => {
1499                         res.push_all(available[..i + 1]);
1500                         used = i + 1;
1501                         break
1502                     }
1503                     None => {
1504                         res.push_all(available);
1505                         used = available.len();
1506                     }
1507                 }
1508             }
1509             self.consume(used);
1510         }
1511         self.consume(used);
1512         Ok(res)
1513     }
1514
1515     /// Reads the next utf8-encoded character from the underlying stream.
1516     ///
1517     /// # Error
1518     ///
1519     /// If an I/O error occurs, or EOF, then this function will return `Err`.
1520     /// This function will also return error if the stream does not contain a
1521     /// valid utf-8 encoded codepoint as the next few bytes in the stream.
1522     fn read_char(&mut self) -> IoResult<char> {
1523         let first_byte = try!(self.read_byte());
1524         let width = str::utf8_char_width(first_byte);
1525         if width == 1 { return Ok(first_byte as char) }
1526         if width == 0 { return Err(standard_error(InvalidInput)) } // not utf8
1527         let mut buf = [first_byte, 0, 0, 0];
1528         {
1529             let mut start = 1;
1530             while start < width {
1531                 match try!(self.read(buf[mut start..width])) {
1532                     n if n == width - start => break,
1533                     n if n < width - start => { start += n; }
1534                     _ => return Err(standard_error(InvalidInput)),
1535                 }
1536             }
1537         }
1538         match str::from_utf8(buf[..width]) {
1539             Some(s) => Ok(s.char_at(0)),
1540             None => Err(standard_error(InvalidInput))
1541         }
1542     }
1543
1544     /// Create an iterator that reads a utf8-encoded character on each iteration
1545     /// until EOF.
1546     ///
1547     /// # Error
1548     ///
1549     /// Any error other than `EndOfFile` that is produced by the underlying Reader
1550     /// is returned by the iterator and should be handled by the caller.
1551     fn chars<'r>(&'r mut self) -> Chars<'r, Self> {
1552         Chars { buffer: self }
1553     }
1554 }
1555
1556 /// When seeking, the resulting cursor is offset from a base by the offset given
1557 /// to the `seek` function. The base used is specified by this enumeration.
1558 pub enum SeekStyle {
1559     /// Seek from the beginning of the stream
1560     SeekSet,
1561     /// Seek from the end of the stream
1562     SeekEnd,
1563     /// Seek from the current position
1564     SeekCur,
1565 }
1566
1567 /// An object implementing `Seek` internally has some form of cursor which can
1568 /// be moved within a stream of bytes. The stream typically has a fixed size,
1569 /// allowing seeking relative to either end.
1570 pub trait Seek {
1571     /// Return position of file cursor in the stream
1572     fn tell(&self) -> IoResult<u64>;
1573
1574     /// Seek to an offset in a stream
1575     ///
1576     /// A successful seek clears the EOF indicator. Seeking beyond EOF is
1577     /// allowed, but seeking before position 0 is not allowed.
1578     ///
1579     /// # Errors
1580     ///
1581     /// * Seeking to a negative offset is considered an error
1582     /// * Seeking past the end of the stream does not modify the underlying
1583     ///   stream, but the next write may cause the previous data to be filled in
1584     ///   with a bit pattern.
1585     fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()>;
1586 }
1587
1588 /// A listener is a value that can consume itself to start listening for
1589 /// connections.
1590 ///
1591 /// Doing so produces some sort of Acceptor.
1592 pub trait Listener<T, A: Acceptor<T>> {
1593     /// Spin up the listener and start queuing incoming connections
1594     ///
1595     /// # Error
1596     ///
1597     /// Returns `Err` if this listener could not be bound to listen for
1598     /// connections. In all cases, this listener is consumed.
1599     fn listen(self) -> IoResult<A>;
1600 }
1601
1602 /// An acceptor is a value that presents incoming connections
1603 pub trait Acceptor<T> {
1604     /// Wait for and accept an incoming connection
1605     ///
1606     /// # Error
1607     ///
1608     /// Returns `Err` if an I/O error is encountered.
1609     fn accept(&mut self) -> IoResult<T>;
1610
1611     /// Create an iterator over incoming connection attempts.
1612     ///
1613     /// Note that I/O errors will be yielded by the iterator itself.
1614     fn incoming<'r>(&'r mut self) -> IncomingConnections<'r, Self> {
1615         IncomingConnections { inc: self }
1616     }
1617 }
1618
1619 /// An infinite iterator over incoming connection attempts.
1620 /// Calling `next` will block the task until a connection is attempted.
1621 ///
1622 /// Since connection attempts can continue forever, this iterator always returns
1623 /// `Some`. The `Some` contains the `IoResult` representing whether the
1624 /// connection attempt was successful.  A successful connection will be wrapped
1625 /// in `Ok`. A failed connection is represented as an `Err`.
1626 pub struct IncomingConnections<'a, A:'a> {
1627     inc: &'a mut A,
1628 }
1629
1630 impl<'a, T, A: Acceptor<T>> Iterator<IoResult<T>> for IncomingConnections<'a, A> {
1631     fn next(&mut self) -> Option<IoResult<T>> {
1632         Some(self.inc.accept())
1633     }
1634 }
1635
1636 /// Creates a standard error for a commonly used flavor of error. The `detail`
1637 /// field of the returned error will always be `None`.
1638 ///
1639 /// # Example
1640 ///
1641 /// ```
1642 /// use std::io;
1643 ///
1644 /// let eof = io::standard_error(io::EndOfFile);
1645 /// let einval = io::standard_error(io::InvalidInput);
1646 /// ```
1647 pub fn standard_error(kind: IoErrorKind) -> IoError {
1648     let desc = match kind {
1649         EndOfFile => "end of file",
1650         IoUnavailable => "I/O is unavailable",
1651         InvalidInput => "invalid input",
1652         OtherIoError => "unknown I/O error",
1653         FileNotFound => "file not found",
1654         PermissionDenied => "permission denied",
1655         ConnectionFailed => "connection failed",
1656         Closed => "stream is closed",
1657         ConnectionRefused => "connection refused",
1658         ConnectionReset => "connection reset",
1659         ConnectionAborted => "connection aborted",
1660         NotConnected => "not connected",
1661         BrokenPipe => "broken pipe",
1662         PathAlreadyExists => "file already exists",
1663         PathDoesntExist => "no such file",
1664         MismatchedFileTypeForOperation => "mismatched file type",
1665         ResourceUnavailable => "resource unavailable",
1666         TimedOut => "operation timed out",
1667         ShortWrite(..) => "short write",
1668         NoProgress => "no progress",
1669     };
1670     IoError {
1671         kind: kind,
1672         desc: desc,
1673         detail: None,
1674     }
1675 }
1676
1677 /// A mode specifies how a file should be opened or created. These modes are
1678 /// passed to `File::open_mode` and are used to control where the file is
1679 /// positioned when it is initially opened.
1680 pub enum FileMode {
1681     /// Opens a file positioned at the beginning.
1682     Open,
1683     /// Opens a file positioned at EOF.
1684     Append,
1685     /// Opens a file, truncating it if it already exists.
1686     Truncate,
1687 }
1688
1689 /// Access permissions with which the file should be opened. `File`s
1690 /// opened with `Read` will return an error if written to.
1691 pub enum FileAccess {
1692     /// Read-only access, requests to write will result in an error
1693     Read,
1694     /// Write-only access, requests to read will result in an error
1695     Write,
1696     /// Read-write access, no requests are denied by default
1697     ReadWrite,
1698 }
1699
1700 /// Different kinds of files which can be identified by a call to stat
1701 #[deriving(PartialEq, Show, Hash)]
1702 pub enum FileType {
1703     /// This is a normal file, corresponding to `S_IFREG`
1704     TypeFile,
1705
1706     /// This file is a directory, corresponding to `S_IFDIR`
1707     TypeDirectory,
1708
1709     /// This file is a named pipe, corresponding to `S_IFIFO`
1710     TypeNamedPipe,
1711
1712     /// This file is a block device, corresponding to `S_IFBLK`
1713     TypeBlockSpecial,
1714
1715     /// This file is a symbolic link to another file, corresponding to `S_IFLNK`
1716     TypeSymlink,
1717
1718     /// The type of this file is not recognized as one of the other categories
1719     TypeUnknown,
1720 }
1721
1722 /// A structure used to describe metadata information about a file. This
1723 /// structure is created through the `stat` method on a `Path`.
1724 ///
1725 /// # Example
1726 ///
1727 /// ```
1728 /// # use std::io::fs::PathExtensions;
1729 /// # fn main() {}
1730 /// # fn foo() {
1731 /// let info = match Path::new("foo.txt").stat() {
1732 ///     Ok(stat) => stat,
1733 ///     Err(e) => fail!("couldn't read foo.txt: {}", e),
1734 /// };
1735 ///
1736 /// println!("byte size: {}", info.size);
1737 /// # }
1738 /// ```
1739 #[deriving(Hash)]
1740 pub struct FileStat {
1741     /// The size of the file, in bytes
1742     pub size: u64,
1743     /// The kind of file this path points to (directory, file, pipe, etc.)
1744     pub kind: FileType,
1745     /// The file permissions currently on the file
1746     pub perm: FilePermission,
1747
1748     // FIXME(#10301): These time fields are pretty useless without an actual
1749     //                time representation, what are the milliseconds relative
1750     //                to?
1751
1752     /// The time that the file was created at, in platform-dependent
1753     /// milliseconds
1754     pub created: u64,
1755     /// The time that this file was last modified, in platform-dependent
1756     /// milliseconds
1757     pub modified: u64,
1758     /// The time that this file was last accessed, in platform-dependent
1759     /// milliseconds
1760     pub accessed: u64,
1761
1762     /// Information returned by stat() which is not guaranteed to be
1763     /// platform-independent. This information may be useful on some platforms,
1764     /// but it may have different meanings or no meaning at all on other
1765     /// platforms.
1766     ///
1767     /// Usage of this field is discouraged, but if access is desired then the
1768     /// fields are located here.
1769     #[unstable]
1770     pub unstable: UnstableFileStat,
1771 }
1772
1773 /// This structure represents all of the possible information which can be
1774 /// returned from a `stat` syscall which is not contained in the `FileStat`
1775 /// structure. This information is not necessarily platform independent, and may
1776 /// have different meanings or no meaning at all on some platforms.
1777 #[unstable]
1778 #[deriving(Hash)]
1779 pub struct UnstableFileStat {
1780     /// The ID of the device containing the file.
1781     pub device: u64,
1782     /// The file serial number.
1783     pub inode: u64,
1784     /// The device ID.
1785     pub rdev: u64,
1786     /// The number of hard links to this file.
1787     pub nlink: u64,
1788     /// The user ID of the file.
1789     pub uid: u64,
1790     /// The group ID of the file.
1791     pub gid: u64,
1792     /// The optimal block size for I/O.
1793     pub blksize: u64,
1794     /// The blocks allocated for this file.
1795     pub blocks: u64,
1796     /// User-defined flags for the file.
1797     pub flags: u64,
1798     /// The file generation number.
1799     pub gen: u64,
1800 }
1801
1802 bitflags! {
1803     #[doc = "A set of permissions for a file or directory is represented"]
1804     #[doc = "by a set of flags which are or'd together."]
1805     flags FilePermission: u32 {
1806         const USER_READ     = 0o400,
1807         const USER_WRITE    = 0o200,
1808         const USER_EXECUTE  = 0o100,
1809         const GROUP_READ    = 0o040,
1810         const GROUP_WRITE   = 0o020,
1811         const GROUP_EXECUTE = 0o010,
1812         const OTHER_READ    = 0o004,
1813         const OTHER_WRITE   = 0o002,
1814         const OTHER_EXECUTE = 0o001,
1815
1816         const USER_RWX  = USER_READ.bits | USER_WRITE.bits | USER_EXECUTE.bits,
1817         const GROUP_RWX = GROUP_READ.bits | GROUP_WRITE.bits | GROUP_EXECUTE.bits,
1818         const OTHER_RWX = OTHER_READ.bits | OTHER_WRITE.bits | OTHER_EXECUTE.bits,
1819
1820         #[doc = "Permissions for user owned files, equivalent to 0644 on"]
1821         #[doc = "unix-like systems."]
1822         const USER_FILE = USER_READ.bits | USER_WRITE.bits | GROUP_READ.bits | OTHER_READ.bits,
1823
1824         #[doc = "Permissions for user owned directories, equivalent to 0755 on"]
1825         #[doc = "unix-like systems."]
1826         const USER_DIR  = USER_RWX.bits | GROUP_READ.bits | GROUP_EXECUTE.bits |
1827                    OTHER_READ.bits | OTHER_EXECUTE.bits,
1828
1829         #[doc = "Permissions for user owned executables, equivalent to 0755"]
1830         #[doc = "on unix-like systems."]
1831         const USER_EXEC = USER_DIR.bits,
1832
1833         #[doc = "All possible permissions enabled."]
1834         const ALL_PERMISSIONS = USER_RWX.bits | GROUP_RWX.bits | OTHER_RWX.bits,
1835
1836         // Deprecated names
1837         #[allow(non_uppercase_statics)]
1838         #[deprecated = "use USER_READ instead"]
1839         const UserRead     = USER_READ.bits,
1840         #[allow(non_uppercase_statics)]
1841         #[deprecated = "use USER_WRITE instead"]
1842         const UserWrite    = USER_WRITE.bits,
1843         #[allow(non_uppercase_statics)]
1844         #[deprecated = "use USER_EXECUTE instead"]
1845         const UserExecute  = USER_EXECUTE.bits,
1846         #[allow(non_uppercase_statics)]
1847         #[deprecated = "use GROUP_READ instead"]
1848         const GroupRead    = GROUP_READ.bits,
1849         #[allow(non_uppercase_statics)]
1850         #[deprecated = "use GROUP_WRITE instead"]
1851         const GroupWrite   = GROUP_WRITE.bits,
1852         #[allow(non_uppercase_statics)]
1853         #[deprecated = "use GROUP_EXECUTE instead"]
1854         const GroupExecute = GROUP_EXECUTE.bits,
1855         #[allow(non_uppercase_statics)]
1856         #[deprecated = "use OTHER_READ instead"]
1857         const OtherRead    = OTHER_READ.bits,
1858         #[allow(non_uppercase_statics)]
1859         #[deprecated = "use OTHER_WRITE instead"]
1860         const OtherWrite   = OTHER_WRITE.bits,
1861         #[allow(non_uppercase_statics)]
1862         #[deprecated = "use OTHER_EXECUTE instead"]
1863         const OtherExecute = OTHER_EXECUTE.bits,
1864
1865         #[allow(non_uppercase_statics)]
1866         #[deprecated = "use USER_RWX instead"]
1867         const UserRWX  = USER_RWX.bits,
1868         #[allow(non_uppercase_statics)]
1869         #[deprecated = "use GROUP_RWX instead"]
1870         const GroupRWX = GROUP_RWX.bits,
1871         #[allow(non_uppercase_statics)]
1872         #[deprecated = "use OTHER_RWX instead"]
1873         const OtherRWX = OTHER_RWX.bits,
1874
1875         #[doc = "Deprecated: use `USER_FILE` instead."]
1876         #[allow(non_uppercase_statics)]
1877         #[deprecated = "use USER_FILE instead"]
1878         const UserFile = USER_FILE.bits,
1879
1880         #[doc = "Deprecated: use `USER_DIR` instead."]
1881         #[allow(non_uppercase_statics)]
1882         #[deprecated = "use USER_DIR instead"]
1883         const UserDir  = USER_DIR.bits,
1884         #[doc = "Deprecated: use `USER_EXEC` instead."]
1885         #[allow(non_uppercase_statics)]
1886         #[deprecated = "use USER_EXEC instead"]
1887         const UserExec = USER_EXEC.bits,
1888
1889         #[doc = "Deprecated: use `ALL_PERMISSIONS` instead"]
1890         #[allow(non_uppercase_statics)]
1891         #[deprecated = "use ALL_PERMISSIONS instead"]
1892         const AllPermissions = ALL_PERMISSIONS.bits,
1893     }
1894 }
1895
1896 impl Default for FilePermission {
1897     #[inline]
1898     fn default() -> FilePermission { FilePermission::empty() }
1899 }
1900
1901 impl fmt::Show for FilePermission {
1902     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1903         formatter.fill = '0';
1904         formatter.width = Some(4);
1905         (&self.bits as &fmt::Octal).fmt(formatter)
1906     }
1907 }
1908
1909 #[cfg(test)]
1910 mod tests {
1911     use super::{IoResult, Reader, MemReader, NoProgress, InvalidInput};
1912     use prelude::*;
1913     use uint;
1914
1915     #[deriving(Clone, PartialEq, Show)]
1916     enum BadReaderBehavior {
1917         GoodBehavior(uint),
1918         BadBehavior(uint)
1919     }
1920
1921     struct BadReader<T> {
1922         r: T,
1923         behavior: Vec<BadReaderBehavior>,
1924     }
1925
1926     impl<T: Reader> BadReader<T> {
1927         fn new(r: T, behavior: Vec<BadReaderBehavior>) -> BadReader<T> {
1928             BadReader { behavior: behavior, r: r }
1929         }
1930     }
1931
1932     impl<T: Reader> Reader for BadReader<T> {
1933         fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
1934             let BadReader { ref mut behavior, ref mut r } = *self;
1935             loop {
1936                 if behavior.is_empty() {
1937                     // fall back on good
1938                     return r.read(buf);
1939                 }
1940                 match behavior.as_mut_slice()[0] {
1941                     GoodBehavior(0) => (),
1942                     GoodBehavior(ref mut x) => {
1943                         *x -= 1;
1944                         return r.read(buf);
1945                     }
1946                     BadBehavior(0) => (),
1947                     BadBehavior(ref mut x) => {
1948                         *x -= 1;
1949                         return Ok(0);
1950                     }
1951                 };
1952                 behavior.remove(0);
1953             }
1954         }
1955     }
1956
1957     #[test]
1958     fn test_read_at_least() {
1959         let mut r = BadReader::new(MemReader::new(b"hello, world!".to_vec()),
1960                                    vec![GoodBehavior(uint::MAX)]);
1961         let mut buf = [0u8, ..5];
1962         assert!(r.read_at_least(1, buf).unwrap() >= 1);
1963         assert!(r.read_exact(5).unwrap().len() == 5); // read_exact uses read_at_least
1964         assert!(r.read_at_least(0, buf).is_ok());
1965
1966         let mut r = BadReader::new(MemReader::new(b"hello, world!".to_vec()),
1967                                    vec![BadBehavior(50), GoodBehavior(uint::MAX)]);
1968         assert!(r.read_at_least(1, buf).unwrap() >= 1);
1969
1970         let mut r = BadReader::new(MemReader::new(b"hello, world!".to_vec()),
1971                                    vec![BadBehavior(1), GoodBehavior(1),
1972                                         BadBehavior(50), GoodBehavior(uint::MAX)]);
1973         assert!(r.read_at_least(1, buf).unwrap() >= 1);
1974         assert!(r.read_at_least(1, buf).unwrap() >= 1);
1975
1976         let mut r = BadReader::new(MemReader::new(b"hello, world!".to_vec()),
1977                                    vec![BadBehavior(uint::MAX)]);
1978         assert_eq!(r.read_at_least(1, buf).unwrap_err().kind, NoProgress);
1979
1980         let mut r = MemReader::new(b"hello, world!".to_vec());
1981         assert_eq!(r.read_at_least(5, buf).unwrap(), 5);
1982         assert_eq!(r.read_at_least(6, buf).unwrap_err().kind, InvalidInput);
1983     }
1984
1985     #[test]
1986     fn test_push_at_least() {
1987         let mut r = BadReader::new(MemReader::new(b"hello, world!".to_vec()),
1988                                    vec![GoodBehavior(uint::MAX)]);
1989         let mut buf = Vec::new();
1990         assert!(r.push_at_least(1, 5, &mut buf).unwrap() >= 1);
1991         assert!(r.push_at_least(0, 5, &mut buf).is_ok());
1992
1993         let mut r = BadReader::new(MemReader::new(b"hello, world!".to_vec()),
1994                                    vec![BadBehavior(50), GoodBehavior(uint::MAX)]);
1995         assert!(r.push_at_least(1, 5, &mut buf).unwrap() >= 1);
1996
1997         let mut r = BadReader::new(MemReader::new(b"hello, world!".to_vec()),
1998                                    vec![BadBehavior(1), GoodBehavior(1),
1999                                         BadBehavior(50), GoodBehavior(uint::MAX)]);
2000         assert!(r.push_at_least(1, 5, &mut buf).unwrap() >= 1);
2001         assert!(r.push_at_least(1, 5, &mut buf).unwrap() >= 1);
2002
2003         let mut r = BadReader::new(MemReader::new(b"hello, world!".to_vec()),
2004                                    vec![BadBehavior(uint::MAX)]);
2005         assert_eq!(r.push_at_least(1, 5, &mut buf).unwrap_err().kind, NoProgress);
2006
2007         let mut r = MemReader::new(b"hello, world!".to_vec());
2008         assert_eq!(r.push_at_least(5, 1, &mut buf).unwrap_err().kind, InvalidInput);
2009     }
2010
2011     #[test]
2012     fn test_show() {
2013         use super::*;
2014
2015         assert_eq!(format!("{}", USER_READ), "0400".to_string());
2016         assert_eq!(format!("{}", USER_FILE), "0644".to_string());
2017         assert_eq!(format!("{}", USER_EXEC), "0755".to_string());
2018         assert_eq!(format!("{}", USER_RWX),  "0700".to_string());
2019         assert_eq!(format!("{}", GROUP_RWX), "0070".to_string());
2020         assert_eq!(format!("{}", OTHER_RWX), "0007".to_string());
2021         assert_eq!(format!("{}", ALL_PERMISSIONS), "0777".to_string());
2022         assert_eq!(format!("{}", USER_READ | USER_WRITE | OTHER_WRITE), "0602".to_string());
2023     }
2024 }