core2/io/
traits.rs

1use super::error::{Error, ErrorKind, Result};
2use core::{cmp, fmt, slice};
3
4#[cfg(feature = "alloc")]
5pub use alloc::vec::Vec;
6
7#[cfg(feature = "alloc")]
8struct Guard<'a> {
9    buf: &'a mut Vec<u8>,
10    len: usize,
11}
12
13#[cfg(feature = "alloc")]
14impl Drop for Guard<'_> {
15    fn drop(&mut self) {
16        unsafe {
17            self.buf.set_len(self.len);
18        }
19    }
20}
21
22// This uses an adaptive system to extend the vector when it fills. We want to
23// avoid paying to allocate and zero a huge chunk of memory if the reader only
24// has 4 bytes while still making large reads if the reader does have a ton
25// of data to return. Simply tacking on an extra DEFAULT_BUF_SIZE space every
26// time is 4,500 times (!) slower than a default reservation size of 32 if the
27// reader has a very small amount of data to return.
28//
29// Because we're extending the buffer with uninitialized data for trusted
30// readers, we need to make sure to truncate that if any of this panics.
31#[cfg(feature = "alloc")]
32fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> {
33    read_to_end_with_reservation(r, buf, |_| 32)
34}
35
36#[cfg(feature = "alloc")]
37fn read_to_end_with_reservation<R, F>(
38    r: &mut R,
39    buf: &mut Vec<u8>,
40    mut reservation_size: F,
41) -> Result<usize>
42where
43    R: Read + ?Sized,
44    F: FnMut(&R) -> usize,
45{
46    let start_len = buf.len();
47    let mut g = Guard {
48        len: buf.len(),
49        buf,
50    };
51    loop {
52        if g.len == g.buf.len() {
53            unsafe {
54                // FIXME(danielhenrymantilla): #42788
55                //
56                //   - This creates a (mut) reference to a slice of
57                //     _uninitialized_ integers, which is **undefined behavior**
58                //
59                //   - Only the standard library gets to soundly "ignore" this,
60                //     based on its privileged knowledge of unstable rustc
61                //     internals;
62                g.buf.reserve(reservation_size(r));
63                let capacity = g.buf.capacity();
64                g.buf.set_len(capacity);
65                r.initializer().initialize(&mut g.buf[g.len..]);
66            }
67        }
68
69        let buf = &mut g.buf[g.len..];
70        match r.read(buf) {
71            Ok(0) => return Ok(g.len - start_len),
72            Ok(n) => {
73                // We can't allow bogus values from read. If it is too large, the returned vec could have its length
74                // set past its capacity, or if it overflows the vec could be shortened which could create an invalid
75                // string if this is called via read_to_string.
76                assert!(n <= buf.len());
77                g.len += n;
78            }
79            Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
80            Err(e) => return Err(e),
81        }
82    }
83}
84
85/// The `Read` trait allows for reading bytes from a source.
86///
87/// Implementors of the `Read` trait are called 'readers'.
88///
89/// Readers are defined by one required method, [`read()`]. Each call to [`read()`]
90/// will attempt to pull bytes from this source into a provided buffer. A
91/// number of other methods are implemented in terms of [`read()`], giving
92/// implementors a number of ways to read bytes while only needing to implement
93/// a single method.
94///
95/// Readers are intended to be composable with one another. Many implementors
96/// throughout [`std::io`] take and provide types which implement the `Read`
97/// trait.
98///
99/// Please note that each call to [`read()`] may involve a system call, and
100/// therefore, using something that implements [`BufRead`], such as
101/// [`BufReader`], will be more efficient.
102///
103/// # Examples
104///
105/// [`File`]s implement `Read`:
106///
107/// ```no_run
108/// use std::io;
109/// use std::io::prelude::*;
110/// use std::fs::File;
111///
112/// fn main() -> io::Result<()> {
113///     let mut f = File::open("foo.txt")?;
114///     let mut buffer = [0; 10];
115///
116///     // read up to 10 bytes
117///     f.read(&mut buffer)?;
118///
119///     let mut buffer = Vec::new();
120///     // read the whole file
121///     f.read_to_end(&mut buffer)?;
122///
123///     // read into a String, so that you don't need to do the conversion.
124///     let mut buffer = String::new();
125///     f.read_to_string(&mut buffer)?;
126///
127///     // and more! See the other methods for more details.
128///     Ok(())
129/// }
130/// ```
131///
132/// Read from [`&str`] because [`&[u8]`][slice] implements `Read`:
133///
134/// ```no_run
135/// # use std::io;
136/// use std::io::prelude::*;
137///
138/// fn main() -> io::Result<()> {
139///     let mut b = "This string will be read".as_bytes();
140///     let mut buffer = [0; 10];
141///
142///     // read up to 10 bytes
143///     b.read(&mut buffer)?;
144///
145///     // etc... it works exactly as a File does!
146///     Ok(())
147/// }
148/// ```
149///
150/// [`read()`]: Read::read
151/// [`&str`]: prim@str
152/// [`std::io`]: self
153/// [`File`]: crate::fs::File
154/// [slice]: ../../std/primitive.slice.html
155pub trait Read {
156    /// Pull some bytes from this source into the specified buffer, returning
157    /// how many bytes were read.
158    ///
159    /// This function does not provide any guarantees about whether it blocks
160    /// waiting for data, but if an object needs to block for a read and cannot,
161    /// it will typically signal this via an [`Err`] return value.
162    ///
163    /// If the return value of this method is [`Ok(n)`], then it must be
164    /// guaranteed that `0 <= n <= buf.len()`. A nonzero `n` value indicates
165    /// that the buffer `buf` has been filled in with `n` bytes of data from this
166    /// source. If `n` is `0`, then it can indicate one of two scenarios:
167    ///
168    /// 1. This reader has reached its "end of file" and will likely no longer
169    ///    be able to produce bytes. Note that this does not mean that the
170    ///    reader will *always* no longer be able to produce bytes.
171    /// 2. The buffer specified was 0 bytes in length.
172    ///
173    /// It is not an error if the returned value `n` is smaller than the buffer size,
174    /// even when the reader is not at the end of the stream yet.
175    /// This may happen for example because fewer bytes are actually available right now
176    /// (e. g. being close to end-of-file) or because read() was interrupted by a signal.
177    ///
178    /// No guarantees are provided about the contents of `buf` when this
179    /// function is called, implementations cannot rely on any property of the
180    /// contents of `buf` being true. It is recommended that *implementations*
181    /// only write data to `buf` instead of reading its contents.
182    ///
183    /// Correspondingly, however, *callers* of this method may not assume any guarantees
184    /// about how the implementation uses `buf`. The trait is safe to implement,
185    /// so it is possible that the code that's supposed to write to the buffer might also read
186    /// from it. It is your responsibility to make sure that `buf` is initialized
187    /// before calling `read`. Calling `read` with an uninitialized `buf` (of the kind one
188    /// obtains via [`MaybeUninit<T>`]) is not safe, and can lead to undefined behavior.
189    ///
190    /// [`MaybeUninit<T>`]: crate::mem::MaybeUninit
191    ///
192    /// # Errors
193    ///
194    /// If this function encounters any form of I/O or other error, an error
195    /// variant will be returned. If an error is returned then it must be
196    /// guaranteed that no bytes were read.
197    ///
198    /// An error of the [`ErrorKind::Interrupted`] kind is non-fatal and the read
199    /// operation should be retried if there is nothing else to do.
200    ///
201    /// # Examples
202    ///
203    /// [`File`]s implement `Read`:
204    ///
205    /// [`Ok(n)`]: Ok
206    /// [`File`]: crate::fs::File
207    ///
208    /// ```no_run
209    /// use std::io;
210    /// use std::io::prelude::*;
211    /// use std::fs::File;
212    ///
213    /// fn main() -> io::Result<()> {
214    ///     let mut f = File::open("foo.txt")?;
215    ///     let mut buffer = [0; 10];
216    ///
217    ///     // read up to 10 bytes
218    ///     let n = f.read(&mut buffer[..])?;
219    ///
220    ///     println!("The bytes: {:?}", &buffer[..n]);
221    ///     Ok(())
222    /// }
223    /// ```
224    fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
225
226    /// Read all bytes until EOF in this source, placing them into `buf`.
227    ///
228    /// All bytes read from this source will be appended to the specified buffer
229    /// `buf`. This function will continuously call [`read()`] to append more data to
230    /// `buf` until [`read()`] returns either [`Ok(0)`] or an error of
231    /// non-[`ErrorKind::Interrupted`] kind.
232    ///
233    /// If successful, this function will return the total number of bytes read.
234    ///
235    /// # Errors
236    ///
237    /// If this function encounters an error of the kind
238    /// [`ErrorKind::Interrupted`] then the error is ignored and the operation
239    /// will continue.
240    ///
241    /// If any other read error is encountered then this function immediately
242    /// returns. Any bytes which have already been read will be appended to
243    /// `buf`.
244    ///
245    /// # Examples
246    ///
247    /// [`File`]s implement `Read`:
248    ///
249    /// [`read()`]: Read::read
250    /// [`Ok(0)`]: Ok
251    /// [`File`]: crate::fs::File
252    ///
253    /// ```no_run
254    /// use std::io;
255    /// use std::io::prelude::*;
256    /// use std::fs::File;
257    ///
258    /// fn main() -> io::Result<()> {
259    ///     let mut f = File::open("foo.txt")?;
260    ///     let mut buffer = Vec::new();
261    ///
262    ///     // read the whole file
263    ///     f.read_to_end(&mut buffer)?;
264    ///     Ok(())
265    /// }
266    /// ```
267    ///
268    /// (See also the [`std::fs::read`] convenience function for reading from a
269    /// file.)
270    ///
271    /// [`std::fs::read`]: crate::fs::read
272    #[cfg(feature = "alloc")]
273    fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> {
274        read_to_end(self, buf)
275    }
276
277    /// Determines if this `Read`er can work with buffers of uninitialized
278    /// memory.
279    ///
280    /// The default implementation returns an initializer which will zero
281    /// buffers.
282    ///
283    /// If a `Read`er guarantees that it can work properly with uninitialized
284    /// memory, it should call [`Initializer::nop()`]. See the documentation for
285    /// [`Initializer`] for details.
286    ///
287    /// The behavior of this method must be independent of the state of the
288    /// `Read`er - the method only takes `&self` so that it can be used through
289    /// trait objects.
290    ///
291    /// # Safety
292    ///
293    /// This method is unsafe because a `Read`er could otherwise return a
294    /// non-zeroing `Initializer` from another `Read` type without an `unsafe`
295    /// block.
296    #[inline]
297    unsafe fn initializer(&self) -> Initializer {
298        Initializer::zeroing()
299    }
300
301    /// Read the exact number of bytes required to fill `buf`.
302    ///
303    /// This function reads as many bytes as necessary to completely fill the
304    /// specified buffer `buf`.
305    ///
306    /// No guarantees are provided about the contents of `buf` when this
307    /// function is called, implementations cannot rely on any property of the
308    /// contents of `buf` being true. It is recommended that implementations
309    /// only write data to `buf` instead of reading its contents. The
310    /// documentation on [`read`] has a more detailed explanation on this
311    /// subject.
312    ///
313    /// # Errors
314    ///
315    /// If this function encounters an error of the kind
316    /// [`ErrorKind::Interrupted`] then the error is ignored and the operation
317    /// will continue.
318    ///
319    /// If this function encounters an "end of file" before completely filling
320    /// the buffer, it returns an error of the kind [`ErrorKind::UnexpectedEof`].
321    /// The contents of `buf` are unspecified in this case.
322    ///
323    /// If any other read error is encountered then this function immediately
324    /// returns. The contents of `buf` are unspecified in this case.
325    ///
326    /// If this function returns an error, it is unspecified how many bytes it
327    /// has read, but it will never read more than would be necessary to
328    /// completely fill the buffer.
329    ///
330    /// # Examples
331    ///
332    /// [`File`]s implement `Read`:
333    ///
334    /// [`read`]: Read::read
335    /// [`File`]: crate::fs::File
336    ///
337    /// ```no_run
338    /// use std::io;
339    /// use std::io::prelude::*;
340    /// use std::fs::File;
341    ///
342    /// fn main() -> io::Result<()> {
343    ///     let mut f = File::open("foo.txt")?;
344    ///     let mut buffer = [0; 10];
345    ///
346    ///     // read exactly 10 bytes
347    ///     f.read_exact(&mut buffer)?;
348    ///     Ok(())
349    /// }
350    /// ```
351    fn read_exact(&mut self, mut buf: &mut [u8]) -> Result<()> {
352        while !buf.is_empty() {
353            match self.read(buf) {
354                Ok(0) => break,
355                Ok(n) => {
356                    let tmp = buf;
357                    buf = &mut tmp[n..];
358                }
359                Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
360                Err(e) => return Err(e),
361            }
362        }
363        if !buf.is_empty() {
364            Err(Error::new(
365                ErrorKind::UnexpectedEof,
366                "failed to fill whole buffer",
367            ))
368        } else {
369            Ok(())
370        }
371    }
372
373    /// Creates a "by reference" adaptor for this instance of `Read`.
374    ///
375    /// The returned adaptor also implements `Read` and will simply borrow this
376    /// current reader.
377    ///
378    /// # Examples
379    ///
380    /// [`File`]s implement `Read`:
381    ///
382    /// [`File`]: crate::fs::File
383    ///
384    /// ```no_run
385    /// use std::io;
386    /// use std::io::Read;
387    /// use std::fs::File;
388    ///
389    /// fn main() -> io::Result<()> {
390    ///     let mut f = File::open("foo.txt")?;
391    ///     let mut buffer = Vec::new();
392    ///     let mut other_buffer = Vec::new();
393    ///
394    ///     {
395    ///         let reference = f.by_ref();
396    ///
397    ///         // read at most 5 bytes
398    ///         reference.take(5).read_to_end(&mut buffer)?;
399    ///
400    ///     } // drop our &mut reference so we can use f again
401    ///
402    ///     // original file still usable, read the rest
403    ///     f.read_to_end(&mut other_buffer)?;
404    ///     Ok(())
405    /// }
406    /// ```
407    fn by_ref(&mut self) -> &mut Self
408    where
409        Self: Sized,
410    {
411        self
412    }
413
414    /// Transforms this `Read` instance to an [`Iterator`] over its bytes.
415    ///
416    /// The returned type implements [`Iterator`] where the `Item` is
417    /// [`Result`]`<`[`u8`]`, `[`io::Error`]`>`.
418    /// The yielded item is [`Ok`] if a byte was successfully read and [`Err`]
419    /// otherwise. EOF is mapped to returning [`None`] from this iterator.
420    ///
421    /// # Examples
422    ///
423    /// [`File`]s implement `Read`:
424    ///
425    /// [`File`]: crate::fs::File
426    /// [`Result`]: crate::result::Result
427    /// [`io::Error`]: self::Error
428    ///
429    /// ```no_run
430    /// use std::io;
431    /// use std::io::prelude::*;
432    /// use std::fs::File;
433    ///
434    /// fn main() -> io::Result<()> {
435    ///     let mut f = File::open("foo.txt")?;
436    ///
437    ///     for byte in f.bytes() {
438    ///         println!("{}", byte.unwrap());
439    ///     }
440    ///     Ok(())
441    /// }
442    /// ```
443    fn bytes(self) -> Bytes<Self>
444    where
445        Self: Sized,
446    {
447        Bytes { inner: self }
448    }
449
450    /// Creates an adaptor which will chain this stream with another.
451    ///
452    /// The returned `Read` instance will first read all bytes from this object
453    /// until EOF is encountered. Afterwards the output is equivalent to the
454    /// output of `next`.
455    ///
456    /// # Examples
457    ///
458    /// [`File`]s implement `Read`:
459    ///
460    /// [`File`]: crate::fs::File
461    ///
462    /// ```no_run
463    /// use std::io;
464    /// use std::io::prelude::*;
465    /// use std::fs::File;
466    ///
467    /// fn main() -> io::Result<()> {
468    ///     let mut f1 = File::open("foo.txt")?;
469    ///     let mut f2 = File::open("bar.txt")?;
470    ///
471    ///     let mut handle = f1.chain(f2);
472    ///     let mut buffer = String::new();
473    ///
474    ///     // read the value into a String. We could use any Read method here,
475    ///     // this is just one example.
476    ///     handle.read_to_string(&mut buffer)?;
477    ///     Ok(())
478    /// }
479    /// ```
480    fn chain<R: Read>(self, next: R) -> Chain<Self, R>
481    where
482        Self: Sized,
483    {
484        Chain {
485            first: self,
486            second: next,
487            done_first: false,
488        }
489    }
490
491    /// Creates an adaptor which will read at most `limit` bytes from it.
492    ///
493    /// This function returns a new instance of `Read` which will read at most
494    /// `limit` bytes, after which it will always return EOF ([`Ok(0)`]). Any
495    /// read errors will not count towards the number of bytes read and future
496    /// calls to [`read()`] may succeed.
497    ///
498    /// # Examples
499    ///
500    /// [`File`]s implement `Read`:
501    ///
502    /// [`File`]: crate::fs::File
503    /// [`Ok(0)`]: Ok
504    /// [`read()`]: Read::read
505    ///
506    /// ```no_run
507    /// use std::io;
508    /// use std::io::prelude::*;
509    /// use std::fs::File;
510    ///
511    /// fn main() -> io::Result<()> {
512    ///     let mut f = File::open("foo.txt")?;
513    ///     let mut buffer = [0; 5];
514    ///
515    ///     // read at most five bytes
516    ///     let mut handle = f.take(5);
517    ///
518    ///     handle.read(&mut buffer)?;
519    ///     Ok(())
520    /// }
521    /// ```
522    fn take(self, limit: u64) -> Take<Self>
523    where
524        Self: Sized,
525    {
526        Take { inner: self, limit }
527    }
528}
529
530/// A type used to conditionally initialize buffers passed to `Read` methods.
531#[derive(Debug)]
532pub struct Initializer(bool);
533
534impl Initializer {
535    /// Returns a new `Initializer` which will zero out buffers.
536    #[inline]
537    pub fn zeroing() -> Initializer {
538        Initializer(true)
539    }
540
541    /// Returns a new `Initializer` which will not zero out buffers.
542    ///
543    /// # Safety
544    ///
545    /// This may only be called by `Read`ers which guarantee that they will not
546    /// read from buffers passed to `Read` methods, and that the return value of
547    /// the method accurately reflects the number of bytes that have been
548    /// written to the head of the buffer.
549    #[inline]
550    pub unsafe fn nop() -> Initializer {
551        Initializer(false)
552    }
553
554    /// Indicates if a buffer should be initialized.
555    #[inline]
556    pub fn should_initialize(&self) -> bool {
557        self.0
558    }
559
560    /// Initializes a buffer if necessary.
561    #[inline]
562    pub fn initialize(&self, buf: &mut [u8]) {
563        if self.should_initialize() {
564            unsafe { core::ptr::write_bytes(buf.as_mut_ptr(), 0, buf.len()) }
565        }
566    }
567}
568
569/// A trait for objects which are byte-oriented sinks.
570///
571/// Implementors of the `Write` trait are sometimes called 'writers'.
572///
573/// Writers are defined by two required methods, [`write`] and [`flush`]:
574///
575/// * The [`write`] method will attempt to write some data into the object,
576///   returning how many bytes were successfully written.
577///
578/// * The [`flush`] method is useful for adaptors and explicit buffers
579///   themselves for ensuring that all buffered data has been pushed out to the
580///   'true sink'.
581///
582/// Writers are intended to be composable with one another. Many implementors
583/// throughout [`std::io`] take and provide types which implement the `Write`
584/// trait.
585///
586/// [`write`]: Write::write
587/// [`flush`]: Write::flush
588/// [`std::io`]: self
589///
590/// # Examples
591///
592/// ```no_run
593/// use std::io::prelude::*;
594/// use std::fs::File;
595///
596/// fn main() -> std::io::Result<()> {
597///     let data = b"some bytes";
598///
599///     let mut pos = 0;
600///     let mut buffer = File::create("foo.txt")?;
601///
602///     while pos < data.len() {
603///         let bytes_written = buffer.write(&data[pos..])?;
604///         pos += bytes_written;
605///     }
606///     Ok(())
607/// }
608/// ```
609///
610/// The trait also provides convenience methods like [`write_all`], which calls
611/// `write` in a loop until its entire input has been written.
612///
613/// [`write_all`]: Write::write_all
614pub trait Write {
615    /// Write a buffer into this writer, returning how many bytes were written.
616    ///
617    /// This function will attempt to write the entire contents of `buf`, but
618    /// the entire write may not succeed, or the write may also generate an
619    /// error. A call to `write` represents *at most one* attempt to write to
620    /// any wrapped object.
621    ///
622    /// Calls to `write` are not guaranteed to block waiting for data to be
623    /// written, and a write which would otherwise block can be indicated through
624    /// an [`Err`] variant.
625    ///
626    /// If the return value is [`Ok(n)`] then it must be guaranteed that
627    /// `n <= buf.len()`. A return value of `0` typically means that the
628    /// underlying object is no longer able to accept bytes and will likely not
629    /// be able to in the future as well, or that the buffer provided is empty.
630    ///
631    /// # Errors
632    ///
633    /// Each call to `write` may generate an I/O error indicating that the
634    /// operation could not be completed. If an error is returned then no bytes
635    /// in the buffer were written to this writer.
636    ///
637    /// It is **not** considered an error if the entire buffer could not be
638    /// written to this writer.
639    ///
640    /// An error of the [`ErrorKind::Interrupted`] kind is non-fatal and the
641    /// write operation should be retried if there is nothing else to do.
642    ///
643    /// # Examples
644    ///
645    /// ```no_run
646    /// use std::io::prelude::*;
647    /// use std::fs::File;
648    ///
649    /// fn main() -> std::io::Result<()> {
650    ///     let mut buffer = File::create("foo.txt")?;
651    ///
652    ///     // Writes some prefix of the byte string, not necessarily all of it.
653    ///     buffer.write(b"some bytes")?;
654    ///     Ok(())
655    /// }
656    /// ```
657    ///
658    /// [`Ok(n)`]: Ok
659    fn write(&mut self, buf: &[u8]) -> Result<usize>;
660
661    /// Flush this output stream, ensuring that all intermediately buffered
662    /// contents reach their destination.
663    ///
664    /// # Errors
665    ///
666    /// It is considered an error if not all bytes could be written due to
667    /// I/O errors or EOF being reached.
668    ///
669    /// # Examples
670    ///
671    /// ```no_run
672    /// use std::io::prelude::*;
673    /// use std::io::BufWriter;
674    /// use std::fs::File;
675    ///
676    /// fn main() -> std::io::Result<()> {
677    ///     let mut buffer = BufWriter::new(File::create("foo.txt")?);
678    ///
679    ///     buffer.write_all(b"some bytes")?;
680    ///     buffer.flush()?;
681    ///     Ok(())
682    /// }
683    /// ```
684    fn flush(&mut self) -> Result<()>;
685
686    /// Attempts to write an entire buffer into this writer.
687    ///
688    /// This method will continuously call [`write`] until there is no more data
689    /// to be written or an error of non-[`ErrorKind::Interrupted`] kind is
690    /// returned. This method will not return until the entire buffer has been
691    /// successfully written or such an error occurs. The first error that is
692    /// not of [`ErrorKind::Interrupted`] kind generated from this method will be
693    /// returned.
694    ///
695    /// If the buffer contains no data, this will never call [`write`].
696    ///
697    /// # Errors
698    ///
699    /// This function will return the first error of
700    /// non-[`ErrorKind::Interrupted`] kind that [`write`] returns.
701    ///
702    /// [`write`]: Write::write
703    ///
704    /// # Examples
705    ///
706    /// ```no_run
707    /// use std::io::prelude::*;
708    /// use std::fs::File;
709    ///
710    /// fn main() -> std::io::Result<()> {
711    ///     let mut buffer = File::create("foo.txt")?;
712    ///
713    ///     buffer.write_all(b"some bytes")?;
714    ///     Ok(())
715    /// }
716    /// ```
717    fn write_all(&mut self, mut buf: &[u8]) -> Result<()> {
718        while !buf.is_empty() {
719            match self.write(buf) {
720                Ok(0) => {
721                    return Err(Error::new(
722                        ErrorKind::WriteZero,
723                        "failed to write whole buffer",
724                    ));
725                }
726                Ok(n) => buf = &buf[n..],
727                Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
728                Err(e) => return Err(e),
729            }
730        }
731        Ok(())
732    }
733    /// Writes a formatted string into this writer, returning any error
734    /// encountered.
735    ///
736    /// This method is primarily used to interface with the
737    /// [`format_args!()`] macro, but it is rare that this should
738    /// explicitly be called. The [`write!()`] macro should be favored to
739    /// invoke this method instead.
740    ///
741    /// This function internally uses the [`write_all`] method on
742    /// this trait and hence will continuously write data so long as no errors
743    /// are received. This also means that partial writes are not indicated in
744    /// this signature.
745    ///
746    /// [`write_all`]: Write::write_all
747    ///
748    /// # Errors
749    ///
750    /// This function will return any I/O error reported while formatting.
751    ///
752    /// # Examples
753    ///
754    /// ```no_run
755    /// use std::io::prelude::*;
756    /// use std::fs::File;
757    ///
758    /// fn main() -> std::io::Result<()> {
759    ///     let mut buffer = File::create("foo.txt")?;
760    ///
761    ///     // this call
762    ///     write!(buffer, "{:.*}", 2, 1.234567)?;
763    ///     // turns into this:
764    ///     buffer.write_fmt(format_args!("{:.*}", 2, 1.234567))?;
765    ///     Ok(())
766    /// }
767    /// ```
768    fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> Result<()> {
769        // Create a shim which translates a Write to a fmt::Write and saves
770        // off I/O errors. instead of discarding them
771        struct Adaptor<'a, T: ?Sized + 'a> {
772            inner: &'a mut T,
773            error: Result<()>,
774        }
775
776        impl<T: Write + ?Sized> fmt::Write for Adaptor<'_, T> {
777            fn write_str(&mut self, s: &str) -> fmt::Result {
778                match self.inner.write_all(s.as_bytes()) {
779                    Ok(()) => Ok(()),
780                    Err(e) => {
781                        self.error = Err(e);
782                        Err(fmt::Error)
783                    }
784                }
785            }
786        }
787
788        let mut output = Adaptor {
789            inner: self,
790            error: Ok(()),
791        };
792        match fmt::write(&mut output, fmt) {
793            Ok(()) => Ok(()),
794            Err(..) => {
795                // check if the error came from the underlying `Write` or not
796                if output.error.is_err() {
797                    output.error
798                } else {
799                    Err(Error::new(ErrorKind::Other, "formatter error"))
800                }
801            }
802        }
803    }
804
805    /// Creates a "by reference" adaptor for this instance of `Write`.
806    ///
807    /// The returned adaptor also implements `Write` and will simply borrow this
808    /// current writer.
809    ///
810    /// # Examples
811    ///
812    /// ```no_run
813    /// use std::io::Write;
814    /// use std::fs::File;
815    ///
816    /// fn main() -> std::io::Result<()> {
817    ///     let mut buffer = File::create("foo.txt")?;
818    ///
819    ///     let reference = buffer.by_ref();
820    ///
821    ///     // we can use reference just like our original buffer
822    ///     reference.write_all(b"some bytes")?;
823    ///     Ok(())
824    /// }
825    /// ```
826    fn by_ref(&mut self) -> &mut Self
827    where
828        Self: Sized,
829    {
830        self
831    }
832}
833
834/// The `Seek` trait provides a cursor which can be moved within a stream of
835/// bytes.
836///
837/// The stream typically has a fixed size, allowing seeking relative to either
838/// end or the current offset.
839///
840/// # Examples
841///
842/// [`File`]s implement `Seek`:
843///
844/// [`File`]: crate::fs::File
845///
846/// ```no_run
847/// use std::io;
848/// use std::io::prelude::*;
849/// use std::fs::File;
850/// use std::io::SeekFrom;
851///
852/// fn main() -> io::Result<()> {
853///     let mut f = File::open("foo.txt")?;
854///
855///     // move the cursor 42 bytes from the start of the file
856///     f.seek(SeekFrom::Start(42))?;
857///     Ok(())
858/// }
859/// ```
860pub trait Seek {
861    /// Seek to an offset, in bytes, in a stream.
862    ///
863    /// A seek beyond the end of a stream is allowed, but behavior is defined
864    /// by the implementation.
865    ///
866    /// If the seek operation completed successfully,
867    /// this method returns the new position from the start of the stream.
868    /// That position can be used later with [`SeekFrom::Start`].
869    ///
870    /// # Errors
871    ///
872    /// Seeking to a negative offset is considered an error.
873    fn seek(&mut self, pos: SeekFrom) -> Result<u64>;
874}
875
876/// Enumeration of possible methods to seek within an I/O object.
877///
878/// It is used by the [`Seek`] trait.
879#[derive(Copy, PartialEq, Eq, Clone, Debug)]
880pub enum SeekFrom {
881    /// Sets the offset to the provided number of bytes.
882    Start(u64),
883
884    /// Sets the offset to the size of this object plus the specified number of
885    /// bytes.
886    ///
887    /// It is possible to seek beyond the end of an object, but it's an error to
888    /// seek before byte 0.
889    End(i64),
890
891    /// Sets the offset to the current position plus the specified number of
892    /// bytes.
893    ///
894    /// It is possible to seek beyond the end of an object, but it's an error to
895    /// seek before byte 0.
896    Current(i64),
897}
898
899/// An iterator over `u8` values of a reader.
900///
901/// This struct is generally created by calling [`bytes`] on a reader.
902/// Please see the documentation of [`bytes`] for more details.
903///
904/// [`bytes`]: Read::bytes
905#[derive(Debug)]
906pub struct Bytes<R> {
907    inner: R,
908}
909
910impl<R: Read> Iterator for Bytes<R> {
911    type Item = Result<u8>;
912
913    fn next(&mut self) -> Option<Result<u8>> {
914        let mut byte = 0;
915        loop {
916            return match self.inner.read(slice::from_mut(&mut byte)) {
917                Ok(0) => None,
918                Ok(..) => Some(Ok(byte)),
919                Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
920                Err(e) => Some(Err(e)),
921            };
922        }
923    }
924}
925
926/// A `BufRead` is a type of `Read`er which has an internal buffer, allowing it
927/// to perform extra ways of reading.
928///
929/// For example, reading line-by-line is inefficient without using a buffer, so
930/// if you want to read by line, you'll need `BufRead`, which includes a
931/// [`read_line`] method as well as a [`lines`] iterator.
932///
933/// # Examples
934///
935/// A locked standard input implements `BufRead`:
936///
937/// ```no_run
938/// use std::io;
939/// use std::io::prelude::*;
940///
941/// let stdin = io::stdin();
942/// for line in stdin.lock().lines() {
943///     println!("{}", line.unwrap());
944/// }
945/// ```
946///
947/// If you have something that implements [`Read`], you can use the [`BufReader`
948/// type][`BufReader`] to turn it into a `BufRead`.
949///
950/// For example, [`File`] implements [`Read`], but not `BufRead`.
951/// [`BufReader`] to the rescue!
952///
953/// [`File`]: crate::fs::File
954/// [`read_line`]: BufRead::read_line
955/// [`lines`]: BufRead::lines
956///
957/// ```no_run
958/// use std::io::{self, BufReader};
959/// use std::io::prelude::*;
960/// use std::fs::File;
961///
962/// fn main() -> io::Result<()> {
963///     let f = File::open("foo.txt")?;
964///     let f = BufReader::new(f);
965///
966///     for line in f.lines() {
967///         println!("{}", line.unwrap());
968///     }
969///
970///     Ok(())
971/// }
972/// ```
973pub trait BufRead: Read {
974    /// Returns the contents of the internal buffer, filling it with more data
975    /// from the inner reader if it is empty.
976    ///
977    /// This function is a lower-level call. It needs to be paired with the
978    /// [`consume`] method to function properly. When calling this
979    /// method, none of the contents will be "read" in the sense that later
980    /// calling `read` may return the same contents. As such, [`consume`] must
981    /// be called with the number of bytes that are consumed from this buffer to
982    /// ensure that the bytes are never returned twice.
983    ///
984    /// [`consume`]: BufRead::consume
985    ///
986    /// An empty buffer returned indicates that the stream has reached EOF.
987    ///
988    /// # Errors
989    ///
990    /// This function will return an I/O error if the underlying reader was
991    /// read, but returned an error.
992    ///
993    /// # Examples
994    ///
995    /// A locked standard input implements `BufRead`:
996    ///
997    /// ```no_run
998    /// use std::io;
999    /// use std::io::prelude::*;
1000    ///
1001    /// let stdin = io::stdin();
1002    /// let mut stdin = stdin.lock();
1003    ///
1004    /// let buffer = stdin.fill_buf().unwrap();
1005    ///
1006    /// // work with buffer
1007    /// println!("{:?}", buffer);
1008    ///
1009    /// // ensure the bytes we worked with aren't returned again later
1010    /// let length = buffer.len();
1011    /// stdin.consume(length);
1012    /// ```
1013    fn fill_buf(&mut self) -> Result<&[u8]>;
1014
1015    /// Tells this buffer that `amt` bytes have been consumed from the buffer,
1016    /// so they should no longer be returned in calls to `read`.
1017    ///
1018    /// This function is a lower-level call. It needs to be paired with the
1019    /// [`fill_buf`] method to function properly. This function does
1020    /// not perform any I/O, it simply informs this object that some amount of
1021    /// its buffer, returned from [`fill_buf`], has been consumed and should
1022    /// no longer be returned. As such, this function may do odd things if
1023    /// [`fill_buf`] isn't called before calling it.
1024    ///
1025    /// The `amt` must be `<=` the number of bytes in the buffer returned by
1026    /// [`fill_buf`].
1027    ///
1028    /// # Examples
1029    ///
1030    /// Since `consume()` is meant to be used with [`fill_buf`],
1031    /// that method's example includes an example of `consume()`.
1032    ///
1033    /// [`fill_buf`]: BufRead::fill_buf
1034    fn consume(&mut self, amt: usize);
1035}
1036
1037/// Adaptor to chain together two readers.
1038///
1039/// This struct is generally created by calling [`chain`] on a reader.
1040/// Please see the documentation of [`chain`] for more details.
1041///
1042/// [`chain`]: Read::chain
1043pub struct Chain<T, U> {
1044    first: T,
1045    second: U,
1046    done_first: bool,
1047}
1048
1049impl<T, U> Chain<T, U> {
1050    /// Consumes the `Chain`, returning the wrapped readers.
1051    ///
1052    /// # Examples
1053    ///
1054    /// ```no_run
1055    /// use std::io;
1056    /// use std::io::prelude::*;
1057    /// use std::fs::File;
1058    ///
1059    /// fn main() -> io::Result<()> {
1060    ///     let mut foo_file = File::open("foo.txt")?;
1061    ///     let mut bar_file = File::open("bar.txt")?;
1062    ///
1063    ///     let chain = foo_file.chain(bar_file);
1064    ///     let (foo_file, bar_file) = chain.into_inner();
1065    ///     Ok(())
1066    /// }
1067    /// ```
1068    pub fn into_inner(self) -> (T, U) {
1069        (self.first, self.second)
1070    }
1071
1072    /// Gets references to the underlying readers in this `Chain`.
1073    ///
1074    /// # Examples
1075    ///
1076    /// ```no_run
1077    /// use std::io;
1078    /// use std::io::prelude::*;
1079    /// use std::fs::File;
1080    ///
1081    /// fn main() -> io::Result<()> {
1082    ///     let mut foo_file = File::open("foo.txt")?;
1083    ///     let mut bar_file = File::open("bar.txt")?;
1084    ///
1085    ///     let chain = foo_file.chain(bar_file);
1086    ///     let (foo_file, bar_file) = chain.get_ref();
1087    ///     Ok(())
1088    /// }
1089    /// ```
1090    pub fn get_ref(&self) -> (&T, &U) {
1091        (&self.first, &self.second)
1092    }
1093
1094    /// Gets mutable references to the underlying readers in this `Chain`.
1095    ///
1096    /// Care should be taken to avoid modifying the internal I/O state of the
1097    /// underlying readers as doing so may corrupt the internal state of this
1098    /// `Chain`.
1099    ///
1100    /// # Examples
1101    ///
1102    /// ```no_run
1103    /// use std::io;
1104    /// use std::io::prelude::*;
1105    /// use std::fs::File;
1106    ///
1107    /// fn main() -> io::Result<()> {
1108    ///     let mut foo_file = File::open("foo.txt")?;
1109    ///     let mut bar_file = File::open("bar.txt")?;
1110    ///
1111    ///     let mut chain = foo_file.chain(bar_file);
1112    ///     let (foo_file, bar_file) = chain.get_mut();
1113    ///     Ok(())
1114    /// }
1115    /// ```
1116    pub fn get_mut(&mut self) -> (&mut T, &mut U) {
1117        (&mut self.first, &mut self.second)
1118    }
1119}
1120
1121impl<T: fmt::Debug, U: fmt::Debug> fmt::Debug for Chain<T, U> {
1122    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1123        f.debug_struct("Chain")
1124            .field("t", &self.first)
1125            .field("u", &self.second)
1126            .finish()
1127    }
1128}
1129
1130impl<T: Read, U: Read> Read for Chain<T, U> {
1131    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1132        if !self.done_first {
1133            match self.first.read(buf)? {
1134                0 if !buf.is_empty() => self.done_first = true,
1135                n => return Ok(n),
1136            }
1137        }
1138        self.second.read(buf)
1139    }
1140
1141    unsafe fn initializer(&self) -> Initializer {
1142        let initializer = self.first.initializer();
1143        if initializer.should_initialize() {
1144            initializer
1145        } else {
1146            self.second.initializer()
1147        }
1148    }
1149}
1150
1151impl<T: BufRead, U: BufRead> BufRead for Chain<T, U> {
1152    fn fill_buf(&mut self) -> Result<&[u8]> {
1153        if !self.done_first {
1154            match self.first.fill_buf()? {
1155                buf if buf.is_empty() => {
1156                    self.done_first = true;
1157                }
1158                buf => return Ok(buf),
1159            }
1160        }
1161        self.second.fill_buf()
1162    }
1163
1164    fn consume(&mut self, amt: usize) {
1165        if !self.done_first {
1166            self.first.consume(amt)
1167        } else {
1168            self.second.consume(amt)
1169        }
1170    }
1171}
1172
1173/// Reader adaptor which limits the bytes read from an underlying reader.
1174///
1175/// This struct is generally created by calling [`take`] on a reader.
1176/// Please see the documentation of [`take`] for more details.
1177///
1178/// [`take`]: Read::take
1179#[derive(Debug)]
1180pub struct Take<T> {
1181    inner: T,
1182    limit: u64,
1183}
1184
1185impl<T> Take<T> {
1186    /// Returns the number of bytes that can be read before this instance will
1187    /// return EOF.
1188    ///
1189    /// # Note
1190    ///
1191    /// This instance may reach `EOF` after reading fewer bytes than indicated by
1192    /// this method if the underlying [`Read`] instance reaches EOF.
1193    ///
1194    /// # Examples
1195    ///
1196    /// ```no_run
1197    /// use std::io;
1198    /// use std::io::prelude::*;
1199    /// use std::fs::File;
1200    ///
1201    /// fn main() -> io::Result<()> {
1202    ///     let f = File::open("foo.txt")?;
1203    ///
1204    ///     // read at most five bytes
1205    ///     let handle = f.take(5);
1206    ///
1207    ///     println!("limit: {}", handle.limit());
1208    ///     Ok(())
1209    /// }
1210    /// ```
1211    pub fn limit(&self) -> u64 {
1212        self.limit
1213    }
1214
1215    /// Sets the number of bytes that can be read before this instance will
1216    /// return EOF. This is the same as constructing a new `Take` instance, so
1217    /// the amount of bytes read and the previous limit value don't matter when
1218    /// calling this method.
1219    ///
1220    /// # Examples
1221    ///
1222    /// ```no_run
1223    /// use std::io;
1224    /// use std::io::prelude::*;
1225    /// use std::fs::File;
1226    ///
1227    /// fn main() -> io::Result<()> {
1228    ///     let f = File::open("foo.txt")?;
1229    ///
1230    ///     // read at most five bytes
1231    ///     let mut handle = f.take(5);
1232    ///     handle.set_limit(10);
1233    ///
1234    ///     assert_eq!(handle.limit(), 10);
1235    ///     Ok(())
1236    /// }
1237    /// ```
1238    pub fn set_limit(&mut self, limit: u64) {
1239        self.limit = limit;
1240    }
1241
1242    /// Consumes the `Take`, returning the wrapped reader.
1243    ///
1244    /// # Examples
1245    ///
1246    /// ```no_run
1247    /// use std::io;
1248    /// use std::io::prelude::*;
1249    /// use std::fs::File;
1250    ///
1251    /// fn main() -> io::Result<()> {
1252    ///     let mut file = File::open("foo.txt")?;
1253    ///
1254    ///     let mut buffer = [0; 5];
1255    ///     let mut handle = file.take(5);
1256    ///     handle.read(&mut buffer)?;
1257    ///
1258    ///     let file = handle.into_inner();
1259    ///     Ok(())
1260    /// }
1261    /// ```
1262    pub fn into_inner(self) -> T {
1263        self.inner
1264    }
1265
1266    /// Gets a reference to the underlying reader.
1267    ///
1268    /// # Examples
1269    ///
1270    /// ```no_run
1271    /// use std::io;
1272    /// use std::io::prelude::*;
1273    /// use std::fs::File;
1274    ///
1275    /// fn main() -> io::Result<()> {
1276    ///     let mut file = File::open("foo.txt")?;
1277    ///
1278    ///     let mut buffer = [0; 5];
1279    ///     let mut handle = file.take(5);
1280    ///     handle.read(&mut buffer)?;
1281    ///
1282    ///     let file = handle.get_ref();
1283    ///     Ok(())
1284    /// }
1285    /// ```
1286    pub fn get_ref(&self) -> &T {
1287        &self.inner
1288    }
1289
1290    /// Gets a mutable reference to the underlying reader.
1291    ///
1292    /// Care should be taken to avoid modifying the internal I/O state of the
1293    /// underlying reader as doing so may corrupt the internal limit of this
1294    /// `Take`.
1295    ///
1296    /// # Examples
1297    ///
1298    /// ```no_run
1299    /// use std::io;
1300    /// use std::io::prelude::*;
1301    /// use std::fs::File;
1302    ///
1303    /// fn main() -> io::Result<()> {
1304    ///     let mut file = File::open("foo.txt")?;
1305    ///
1306    ///     let mut buffer = [0; 5];
1307    ///     let mut handle = file.take(5);
1308    ///     handle.read(&mut buffer)?;
1309    ///
1310    ///     let file = handle.get_mut();
1311    ///     Ok(())
1312    /// }
1313    /// ```
1314    pub fn get_mut(&mut self) -> &mut T {
1315        &mut self.inner
1316    }
1317}
1318
1319impl<T: Read> Read for Take<T> {
1320    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1321        // Don't call into inner reader at all at EOF because it may still block
1322        if self.limit == 0 {
1323            return Ok(0);
1324        }
1325
1326        let max = cmp::min(buf.len() as u64, self.limit) as usize;
1327        let n = self.inner.read(&mut buf[..max])?;
1328        self.limit -= n as u64;
1329        Ok(n)
1330    }
1331
1332    unsafe fn initializer(&self) -> Initializer {
1333        self.inner.initializer()
1334    }
1335
1336    #[cfg(feature = "alloc")]
1337    fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> {
1338        // Pass in a reservation_size closure that respects the current value
1339        // of limit for each read. If we hit the read limit, this prevents the
1340        // final zero-byte read from allocating again.
1341        read_to_end_with_reservation(self, buf, |self_| cmp::min(self_.limit, 32) as usize)
1342    }
1343}
1344
1345impl<T: BufRead> BufRead for Take<T> {
1346    fn fill_buf(&mut self) -> Result<&[u8]> {
1347        // Don't call into inner reader at all at EOF because it may still block
1348        if self.limit == 0 {
1349            return Ok(&[]);
1350        }
1351
1352        let buf = self.inner.fill_buf()?;
1353        let cap = cmp::min(buf.len() as u64, self.limit) as usize;
1354        Ok(&buf[..cap])
1355    }
1356
1357    fn consume(&mut self, amt: usize) {
1358        // Don't let callers reset the limit by passing an overlarge value
1359        let amt = cmp::min(amt as u64, self.limit) as usize;
1360        self.limit -= amt as u64;
1361        self.inner.consume(amt);
1362    }
1363}