1 use crate::io::util::chain::{chain, Chain};
2 use crate::io::util::read::{read, Read};
3 use crate::io::util::read_buf::{read_buf, ReadBuf};
4 use crate::io::util::read_exact::{read_exact, ReadExact};
5 use crate::io::util::read_int::{ReadF32, ReadF32Le, ReadF64, ReadF64Le};
6 use crate::io::util::read_int::{
7     ReadI128, ReadI128Le, ReadI16, ReadI16Le, ReadI32, ReadI32Le, ReadI64, ReadI64Le, ReadI8,
8 };
9 use crate::io::util::read_int::{
10     ReadU128, ReadU128Le, ReadU16, ReadU16Le, ReadU32, ReadU32Le, ReadU64, ReadU64Le, ReadU8,
11 };
12 use crate::io::util::read_to_end::{read_to_end, ReadToEnd};
13 use crate::io::util::read_to_string::{read_to_string, ReadToString};
14 use crate::io::util::take::{take, Take};
15 use crate::io::AsyncRead;
16 
17 use bytes::BufMut;
18 
19 cfg_io_util! {
20     /// Defines numeric reader
21     macro_rules! read_impl {
22         (
23             $(
24                 $(#[$outer:meta])*
25                 fn $name:ident(&mut self) -> $($fut:ident)*;
26             )*
27         ) => {
28             $(
29                 $(#[$outer])*
30                 fn $name<'a>(&'a mut self) -> $($fut)*<&'a mut Self> where Self: Unpin {
31                     $($fut)*::new(self)
32                 }
33             )*
34         }
35     }
36 
37     /// Reads bytes from a source.
38     ///
39     /// Implemented as an extension trait, adding utility methods to all
40     /// [`AsyncRead`] types. Callers will tend to import this trait instead of
41     /// [`AsyncRead`].
42     ///
43     /// ```no_run
44     /// use tokio::fs::File;
45     /// use tokio::io::{self, AsyncReadExt};
46     ///
47     /// #[tokio::main]
48     /// async fn main() -> io::Result<()> {
49     ///     let mut f = File::open("foo.txt").await?;
50     ///     let mut buffer = [0; 10];
51     ///
52     ///     // The `read` method is defined by this trait.
53     ///     let n = f.read(&mut buffer[..]).await?;
54     ///
55     ///     Ok(())
56     /// }
57     /// ```
58     ///
59     /// See [module][crate::io] documentation for more details.
60     ///
61     /// [`AsyncRead`]: AsyncRead
62     pub trait AsyncReadExt: AsyncRead {
63         /// Creates a new `AsyncRead` instance that chains this stream with
64         /// `next`.
65         ///
66         /// The returned `AsyncRead` instance will first read all bytes from this object
67         /// until EOF is encountered. Afterwards the output is equivalent to the
68         /// output of `next`.
69         ///
70         /// # Examples
71         ///
72         /// [`File`][crate::fs::File]s implement `AsyncRead`:
73         ///
74         /// ```no_run
75         /// use tokio::fs::File;
76         /// use tokio::io::{self, AsyncReadExt};
77         ///
78         /// #[tokio::main]
79         /// async fn main() -> io::Result<()> {
80         ///     let f1 = File::open("foo.txt").await?;
81         ///     let f2 = File::open("bar.txt").await?;
82         ///
83         ///     let mut handle = f1.chain(f2);
84         ///     let mut buffer = String::new();
85         ///
86         ///     // read the value into a String. We could use any AsyncRead
87         ///     // method here, this is just one example.
88         ///     handle.read_to_string(&mut buffer).await?;
89         ///     Ok(())
90         /// }
91         /// ```
92         fn chain<R>(self, next: R) -> Chain<Self, R>
93         where
94             Self: Sized,
95             R: AsyncRead,
96         {
97             chain(self, next)
98         }
99 
100         /// Pulls some bytes from this source into the specified buffer,
101         /// returning how many bytes were read.
102         ///
103         /// Equivalent to:
104         ///
105         /// ```ignore
106         /// async fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>;
107         /// ```
108         ///
109         /// This method does not provide any guarantees about whether it
110         /// completes immediately or asynchronously.
111         ///
112         /// # Return
113         ///
114         /// If the return value of this method is `Ok(n)`, then it must be
115         /// guaranteed that `0 <= n <= buf.len()`. A nonzero `n` value indicates
116         /// that the buffer `buf` has been filled in with `n` bytes of data from
117         /// this source. If `n` is `0`, then it can indicate one of two
118         /// scenarios:
119         ///
120         /// 1. This reader has reached its "end of file" and will likely no longer
121         ///    be able to produce bytes. Note that this does not mean that the
122         ///    reader will *always* no longer be able to produce bytes.
123         /// 2. The buffer specified was 0 bytes in length.
124         ///
125         /// No guarantees are provided about the contents of `buf` when this
126         /// function is called, implementations cannot rely on any property of the
127         /// contents of `buf` being `true`. It is recommended that *implementations*
128         /// only write data to `buf` instead of reading its contents.
129         ///
130         /// Correspondingly, however, *callers* of this method may not assume
131         /// any guarantees about how the implementation uses `buf`. It is
132         /// possible that the code that's supposed to write to the buffer might
133         /// also read from it. It is your responsibility to make sure that `buf`
134         /// is initialized before calling `read`.
135         ///
136         /// # Errors
137         ///
138         /// If this function encounters any form of I/O or other error, an error
139         /// variant will be returned. If an error is returned then it must be
140         /// guaranteed that no bytes were read.
141         ///
142         /// # Cancel safety
143         ///
144         /// This method is cancel safe. If you use it as the event in a
145         /// [`tokio::select!`](crate::select) statement and some other branch
146         /// completes first, then it is guaranteed that no data was read.
147         ///
148         /// # Examples
149         ///
150         /// [`File`][crate::fs::File]s implement `Read`:
151         ///
152         /// ```no_run
153         /// use tokio::fs::File;
154         /// use tokio::io::{self, AsyncReadExt};
155         ///
156         /// #[tokio::main]
157         /// async fn main() -> io::Result<()> {
158         ///     let mut f = File::open("foo.txt").await?;
159         ///     let mut buffer = [0; 10];
160         ///
161         ///     // read up to 10 bytes
162         ///     let n = f.read(&mut buffer[..]).await?;
163         ///
164         ///     println!("The bytes: {:?}", &buffer[..n]);
165         ///     Ok(())
166         /// }
167         /// ```
168         fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>
169         where
170             Self: Unpin,
171         {
172             read(self, buf)
173         }
174 
175         /// Pulls some bytes from this source into the specified buffer,
176         /// advancing the buffer's internal cursor.
177         ///
178         /// Equivalent to:
179         ///
180         /// ```ignore
181         /// async fn read_buf<B: BufMut>(&mut self, buf: &mut B) -> io::Result<usize>;
182         /// ```
183         ///
184         /// Usually, only a single `read` syscall is issued, even if there is
185         /// more space in the supplied buffer.
186         ///
187         /// This method does not provide any guarantees about whether it
188         /// completes immediately or asynchronously.
189         ///
190         /// # Return
191         ///
192         /// A nonzero `n` value indicates that the buffer `buf` has been filled
193         /// in with `n` bytes of data from this source. If `n` is `0`, then it
194         /// can indicate one of two scenarios:
195         ///
196         /// 1. This reader has reached its "end of file" and will likely no longer
197         ///    be able to produce bytes. Note that this does not mean that the
198         ///    reader will *always* no longer be able to produce bytes.
199         /// 2. The buffer specified had a remaining capacity of zero.
200         ///
201         /// # Errors
202         ///
203         /// If this function encounters any form of I/O or other error, an error
204         /// variant will be returned. If an error is returned then it must be
205         /// guaranteed that no bytes were read.
206         ///
207         /// # Cancel safety
208         ///
209         /// This method is cancel safe. If you use it as the event in a
210         /// [`tokio::select!`](crate::select) statement and some other branch
211         /// completes first, then it is guaranteed that no data was read.
212         ///
213         /// # Examples
214         ///
215         /// [`File`] implements `Read` and [`BytesMut`] implements [`BufMut`]:
216         ///
217         /// [`File`]: crate::fs::File
218         /// [`BytesMut`]: bytes::BytesMut
219         /// [`BufMut`]: bytes::BufMut
220         ///
221         /// ```no_run
222         /// use tokio::fs::File;
223         /// use tokio::io::{self, AsyncReadExt};
224         ///
225         /// use bytes::BytesMut;
226         ///
227         /// #[tokio::main]
228         /// async fn main() -> io::Result<()> {
229         ///     let mut f = File::open("foo.txt").await?;
230         ///     let mut buffer = BytesMut::with_capacity(10);
231         ///
232         ///     assert!(buffer.is_empty());
233         ///
234         ///     // read up to 10 bytes, note that the return value is not needed
235         ///     // to access the data that was read as `buffer`'s internal
236         ///     // cursor is updated.
237         ///     f.read_buf(&mut buffer).await?;
238         ///
239         ///     println!("The bytes: {:?}", &buffer[..]);
240         ///     Ok(())
241         /// }
242         /// ```
243         fn read_buf<'a, B>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>
244         where
245             Self: Sized + Unpin,
246             B: BufMut,
247         {
248             read_buf(self, buf)
249         }
250 
251         /// Reads the exact number of bytes required to fill `buf`.
252         ///
253         /// Equivalent to:
254         ///
255         /// ```ignore
256         /// async fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<usize>;
257         /// ```
258         ///
259         /// This function reads as many bytes as necessary to completely fill
260         /// the specified buffer `buf`.
261         ///
262         /// # Errors
263         ///
264         /// If the operation encounters an "end of file" before completely
265         /// filling the buffer, it returns an error of the kind
266         /// [`ErrorKind::UnexpectedEof`]. The contents of `buf` are unspecified
267         /// in this case.
268         ///
269         /// If any other read error is encountered then the operation
270         /// immediately returns. The contents of `buf` are unspecified in this
271         /// case.
272         ///
273         /// If this operation returns an error, it is unspecified how many bytes
274         /// it has read, but it will never read more than would be necessary to
275         /// completely fill the buffer.
276         ///
277         /// # Cancel safety
278         ///
279         /// This method is not cancellation safe. If the method is used as the
280         /// event in a [`tokio::select!`](crate::select) statement and some
281         /// other branch completes first, then some data may already have been
282         /// read into `buf`.
283         ///
284         /// # Examples
285         ///
286         /// [`File`][crate::fs::File]s implement `Read`:
287         ///
288         /// ```no_run
289         /// use tokio::fs::File;
290         /// use tokio::io::{self, AsyncReadExt};
291         ///
292         /// #[tokio::main]
293         /// async fn main() -> io::Result<()> {
294         ///     let mut f = File::open("foo.txt").await?;
295         ///     let mut buffer = [0; 10];
296         ///
297         ///     // read exactly 10 bytes
298         ///     f.read_exact(&mut buffer).await?;
299         ///     Ok(())
300         /// }
301         /// ```
302         ///
303         /// [`ErrorKind::UnexpectedEof`]: std::io::ErrorKind::UnexpectedEof
304         fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>
305         where
306             Self: Unpin,
307         {
308             read_exact(self, buf)
309         }
310 
311         read_impl! {
312             /// Reads an unsigned 8 bit integer from the underlying reader.
313             ///
314             /// Equivalent to:
315             ///
316             /// ```ignore
317             /// async fn read_u8(&mut self) -> io::Result<u8>;
318             /// ```
319             ///
320             /// It is recommended to use a buffered reader to avoid excessive
321             /// syscalls.
322             ///
323             /// # Errors
324             ///
325             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
326             ///
327             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
328             ///
329             /// # Examples
330             ///
331             /// Read unsigned 8 bit integers from an `AsyncRead`:
332             ///
333             /// ```rust
334             /// use tokio::io::{self, AsyncReadExt};
335             ///
336             /// use std::io::Cursor;
337             ///
338             /// #[tokio::main]
339             /// async fn main() -> io::Result<()> {
340             ///     let mut reader = Cursor::new(vec![2, 5]);
341             ///
342             ///     assert_eq!(2, reader.read_u8().await?);
343             ///     assert_eq!(5, reader.read_u8().await?);
344             ///
345             ///     Ok(())
346             /// }
347             /// ```
348             fn read_u8(&mut self) -> ReadU8;
349 
350             /// Reads a signed 8 bit integer from the underlying reader.
351             ///
352             /// Equivalent to:
353             ///
354             /// ```ignore
355             /// async fn read_i8(&mut self) -> io::Result<i8>;
356             /// ```
357             ///
358             /// It is recommended to use a buffered reader to avoid excessive
359             /// syscalls.
360             ///
361             /// # Errors
362             ///
363             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
364             ///
365             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
366             ///
367             /// # Examples
368             ///
369             /// Read unsigned 8 bit integers from an `AsyncRead`:
370             ///
371             /// ```rust
372             /// use tokio::io::{self, AsyncReadExt};
373             ///
374             /// use std::io::Cursor;
375             ///
376             /// #[tokio::main]
377             /// async fn main() -> io::Result<()> {
378             ///     let mut reader = Cursor::new(vec![0x02, 0xfb]);
379             ///
380             ///     assert_eq!(2, reader.read_i8().await?);
381             ///     assert_eq!(-5, reader.read_i8().await?);
382             ///
383             ///     Ok(())
384             /// }
385             /// ```
386             fn read_i8(&mut self) -> ReadI8;
387 
388             /// Reads an unsigned 16-bit integer in big-endian order from the
389             /// underlying reader.
390             ///
391             /// Equivalent to:
392             ///
393             /// ```ignore
394             /// async fn read_u16(&mut self) -> io::Result<u16>;
395             /// ```
396             ///
397             /// It is recommended to use a buffered reader to avoid excessive
398             /// syscalls.
399             ///
400             /// # Errors
401             ///
402             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
403             ///
404             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
405             ///
406             /// # Examples
407             ///
408             /// Read unsigned 16 bit big-endian integers from a `AsyncRead`:
409             ///
410             /// ```rust
411             /// use tokio::io::{self, AsyncReadExt};
412             ///
413             /// use std::io::Cursor;
414             ///
415             /// #[tokio::main]
416             /// async fn main() -> io::Result<()> {
417             ///     let mut reader = Cursor::new(vec![2, 5, 3, 0]);
418             ///
419             ///     assert_eq!(517, reader.read_u16().await?);
420             ///     assert_eq!(768, reader.read_u16().await?);
421             ///     Ok(())
422             /// }
423             /// ```
424             fn read_u16(&mut self) -> ReadU16;
425 
426             /// Reads a signed 16-bit integer in big-endian order from the
427             /// underlying reader.
428             ///
429             /// Equivalent to:
430             ///
431             /// ```ignore
432             /// async fn read_i16(&mut self) -> io::Result<i16>;
433             /// ```
434             ///
435             /// It is recommended to use a buffered reader to avoid excessive
436             /// syscalls.
437             ///
438             /// # Errors
439             ///
440             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
441             ///
442             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
443             ///
444             /// # Examples
445             ///
446             /// Read signed 16 bit big-endian integers from a `AsyncRead`:
447             ///
448             /// ```rust
449             /// use tokio::io::{self, AsyncReadExt};
450             ///
451             /// use std::io::Cursor;
452             ///
453             /// #[tokio::main]
454             /// async fn main() -> io::Result<()> {
455             ///     let mut reader = Cursor::new(vec![0x00, 0xc1, 0xff, 0x7c]);
456             ///
457             ///     assert_eq!(193, reader.read_i16().await?);
458             ///     assert_eq!(-132, reader.read_i16().await?);
459             ///     Ok(())
460             /// }
461             /// ```
462             fn read_i16(&mut self) -> ReadI16;
463 
464             /// Reads an unsigned 32-bit integer in big-endian order from the
465             /// underlying reader.
466             ///
467             /// Equivalent to:
468             ///
469             /// ```ignore
470             /// async fn read_u32(&mut self) -> io::Result<u32>;
471             /// ```
472             ///
473             /// It is recommended to use a buffered reader to avoid excessive
474             /// syscalls.
475             ///
476             /// # Errors
477             ///
478             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
479             ///
480             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
481             ///
482             /// # Examples
483             ///
484             /// Read unsigned 32-bit big-endian integers from a `AsyncRead`:
485             ///
486             /// ```rust
487             /// use tokio::io::{self, AsyncReadExt};
488             ///
489             /// use std::io::Cursor;
490             ///
491             /// #[tokio::main]
492             /// async fn main() -> io::Result<()> {
493             ///     let mut reader = Cursor::new(vec![0x00, 0x00, 0x01, 0x0b]);
494             ///
495             ///     assert_eq!(267, reader.read_u32().await?);
496             ///     Ok(())
497             /// }
498             /// ```
499             fn read_u32(&mut self) -> ReadU32;
500 
501             /// Reads a signed 32-bit integer in big-endian order from the
502             /// underlying reader.
503             ///
504             ///
505             /// Equivalent to:
506             ///
507             /// ```ignore
508             /// async fn read_i32(&mut self) -> io::Result<i32>;
509             /// ```
510             ///
511             /// It is recommended to use a buffered reader to avoid excessive
512             /// syscalls.
513             ///
514             /// # Errors
515             ///
516             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
517             ///
518             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
519             ///
520             /// # Examples
521             ///
522             /// Read signed 32-bit big-endian integers from a `AsyncRead`:
523             ///
524             /// ```rust
525             /// use tokio::io::{self, AsyncReadExt};
526             ///
527             /// use std::io::Cursor;
528             ///
529             /// #[tokio::main]
530             /// async fn main() -> io::Result<()> {
531             ///     let mut reader = Cursor::new(vec![0xff, 0xff, 0x7a, 0x33]);
532             ///
533             ///     assert_eq!(-34253, reader.read_i32().await?);
534             ///     Ok(())
535             /// }
536             /// ```
537             fn read_i32(&mut self) -> ReadI32;
538 
539             /// Reads an unsigned 64-bit integer in big-endian order from the
540             /// underlying reader.
541             ///
542             /// Equivalent to:
543             ///
544             /// ```ignore
545             /// async fn read_u64(&mut self) -> io::Result<u64>;
546             /// ```
547             ///
548             /// It is recommended to use a buffered reader to avoid excessive
549             /// syscalls.
550             ///
551             /// # Errors
552             ///
553             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
554             ///
555             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
556             ///
557             /// # Examples
558             ///
559             /// Read unsigned 64-bit big-endian integers from a `AsyncRead`:
560             ///
561             /// ```rust
562             /// use tokio::io::{self, AsyncReadExt};
563             ///
564             /// use std::io::Cursor;
565             ///
566             /// #[tokio::main]
567             /// async fn main() -> io::Result<()> {
568             ///     let mut reader = Cursor::new(vec![
569             ///         0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83
570             ///     ]);
571             ///
572             ///     assert_eq!(918733457491587, reader.read_u64().await?);
573             ///     Ok(())
574             /// }
575             /// ```
576             fn read_u64(&mut self) -> ReadU64;
577 
578             /// Reads an signed 64-bit integer in big-endian order from the
579             /// underlying reader.
580             ///
581             /// Equivalent to:
582             ///
583             /// ```ignore
584             /// async fn read_i64(&mut self) -> io::Result<i64>;
585             /// ```
586             ///
587             /// It is recommended to use a buffered reader to avoid excessive
588             /// syscalls.
589             ///
590             /// # Errors
591             ///
592             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
593             ///
594             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
595             ///
596             /// # Examples
597             ///
598             /// Read signed 64-bit big-endian integers from a `AsyncRead`:
599             ///
600             /// ```rust
601             /// use tokio::io::{self, AsyncReadExt};
602             ///
603             /// use std::io::Cursor;
604             ///
605             /// #[tokio::main]
606             /// async fn main() -> io::Result<()> {
607             ///     let mut reader = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0]);
608             ///
609             ///     assert_eq!(i64::MIN, reader.read_i64().await?);
610             ///     Ok(())
611             /// }
612             /// ```
613             fn read_i64(&mut self) -> ReadI64;
614 
615             /// Reads an unsigned 128-bit integer in big-endian order from the
616             /// underlying reader.
617             ///
618             /// Equivalent to:
619             ///
620             /// ```ignore
621             /// async fn read_u128(&mut self) -> io::Result<u128>;
622             /// ```
623             ///
624             /// It is recommended to use a buffered reader to avoid excessive
625             /// syscalls.
626             ///
627             /// # Errors
628             ///
629             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
630             ///
631             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
632             ///
633             /// # Examples
634             ///
635             /// Read unsigned 128-bit big-endian integers from a `AsyncRead`:
636             ///
637             /// ```rust
638             /// use tokio::io::{self, AsyncReadExt};
639             ///
640             /// use std::io::Cursor;
641             ///
642             /// #[tokio::main]
643             /// async fn main() -> io::Result<()> {
644             ///     let mut reader = Cursor::new(vec![
645             ///         0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83,
646             ///         0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83
647             ///     ]);
648             ///
649             ///     assert_eq!(16947640962301618749969007319746179, reader.read_u128().await?);
650             ///     Ok(())
651             /// }
652             /// ```
653             fn read_u128(&mut self) -> ReadU128;
654 
655             /// Reads an signed 128-bit integer in big-endian order from the
656             /// underlying reader.
657             ///
658             /// Equivalent to:
659             ///
660             /// ```ignore
661             /// async fn read_i128(&mut self) -> io::Result<i128>;
662             /// ```
663             ///
664             /// It is recommended to use a buffered reader to avoid excessive
665             /// syscalls.
666             ///
667             /// # Errors
668             ///
669             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
670             ///
671             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
672             ///
673             /// # Examples
674             ///
675             /// Read signed 128-bit big-endian integers from a `AsyncRead`:
676             ///
677             /// ```rust
678             /// use tokio::io::{self, AsyncReadExt};
679             ///
680             /// use std::io::Cursor;
681             ///
682             /// #[tokio::main]
683             /// async fn main() -> io::Result<()> {
684             ///     let mut reader = Cursor::new(vec![
685             ///         0x80, 0, 0, 0, 0, 0, 0, 0,
686             ///         0, 0, 0, 0, 0, 0, 0, 0
687             ///     ]);
688             ///
689             ///     assert_eq!(i128::MIN, reader.read_i128().await?);
690             ///     Ok(())
691             /// }
692             /// ```
693             fn read_i128(&mut self) -> ReadI128;
694 
695             /// Reads an 32-bit floating point type in big-endian order from the
696             /// underlying reader.
697             ///
698             /// Equivalent to:
699             ///
700             /// ```ignore
701             /// async fn read_f32(&mut self) -> io::Result<f32>;
702             /// ```
703             ///
704             /// It is recommended to use a buffered reader to avoid excessive
705             /// syscalls.
706             ///
707             /// # Errors
708             ///
709             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
710             ///
711             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
712             ///
713             /// # Examples
714             ///
715             /// Read 32-bit floating point type from a `AsyncRead`:
716             ///
717             /// ```rust
718             /// use tokio::io::{self, AsyncReadExt};
719             ///
720             /// use std::io::Cursor;
721             ///
722             /// #[tokio::main]
723             /// async fn main() -> io::Result<()> {
724             ///     let mut reader = Cursor::new(vec![0xff, 0x7f, 0xff, 0xff]);
725             ///
726             ///     assert_eq!(f32::MIN, reader.read_f32().await?);
727             ///     Ok(())
728             /// }
729             /// ```
730             fn read_f32(&mut self) -> ReadF32;
731 
732             /// Reads an 64-bit floating point type in big-endian order from the
733             /// underlying reader.
734             ///
735             /// Equivalent to:
736             ///
737             /// ```ignore
738             /// async fn read_f64(&mut self) -> io::Result<f64>;
739             /// ```
740             ///
741             /// It is recommended to use a buffered reader to avoid excessive
742             /// syscalls.
743             ///
744             /// # Errors
745             ///
746             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
747             ///
748             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
749             ///
750             /// # Examples
751             ///
752             /// Read 64-bit floating point type from a `AsyncRead`:
753             ///
754             /// ```rust
755             /// use tokio::io::{self, AsyncReadExt};
756             ///
757             /// use std::io::Cursor;
758             ///
759             /// #[tokio::main]
760             /// async fn main() -> io::Result<()> {
761             ///     let mut reader = Cursor::new(vec![
762             ///         0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
763             ///     ]);
764             ///
765             ///     assert_eq!(f64::MIN, reader.read_f64().await?);
766             ///     Ok(())
767             /// }
768             /// ```
769             fn read_f64(&mut self) -> ReadF64;
770 
771             /// Reads an unsigned 16-bit integer in little-endian order from the
772             /// underlying reader.
773             ///
774             /// Equivalent to:
775             ///
776             /// ```ignore
777             /// async fn read_u16_le(&mut self) -> io::Result<u16>;
778             /// ```
779             ///
780             /// It is recommended to use a buffered reader to avoid excessive
781             /// syscalls.
782             ///
783             /// # Errors
784             ///
785             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
786             ///
787             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
788             ///
789             /// # Examples
790             ///
791             /// Read unsigned 16 bit little-endian integers from a `AsyncRead`:
792             ///
793             /// ```rust
794             /// use tokio::io::{self, AsyncReadExt};
795             ///
796             /// use std::io::Cursor;
797             ///
798             /// #[tokio::main]
799             /// async fn main() -> io::Result<()> {
800             ///     let mut reader = Cursor::new(vec![2, 5, 3, 0]);
801             ///
802             ///     assert_eq!(1282, reader.read_u16_le().await?);
803             ///     assert_eq!(3, reader.read_u16_le().await?);
804             ///     Ok(())
805             /// }
806             /// ```
807             fn read_u16_le(&mut self) -> ReadU16Le;
808 
809             /// Reads a signed 16-bit integer in little-endian order from the
810             /// underlying reader.
811             ///
812             /// Equivalent to:
813             ///
814             /// ```ignore
815             /// async fn read_i16_le(&mut self) -> io::Result<i16>;
816             /// ```
817             ///
818             /// It is recommended to use a buffered reader to avoid excessive
819             /// syscalls.
820             ///
821             /// # Errors
822             ///
823             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
824             ///
825             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
826             ///
827             /// # Examples
828             ///
829             /// Read signed 16 bit little-endian integers from a `AsyncRead`:
830             ///
831             /// ```rust
832             /// use tokio::io::{self, AsyncReadExt};
833             ///
834             /// use std::io::Cursor;
835             ///
836             /// #[tokio::main]
837             /// async fn main() -> io::Result<()> {
838             ///     let mut reader = Cursor::new(vec![0x00, 0xc1, 0xff, 0x7c]);
839             ///
840             ///     assert_eq!(-16128, reader.read_i16_le().await?);
841             ///     assert_eq!(31999, reader.read_i16_le().await?);
842             ///     Ok(())
843             /// }
844             /// ```
845             fn read_i16_le(&mut self) -> ReadI16Le;
846 
847             /// Reads an unsigned 32-bit integer in little-endian order from the
848             /// underlying reader.
849             ///
850             /// Equivalent to:
851             ///
852             /// ```ignore
853             /// async fn read_u32_le(&mut self) -> io::Result<u32>;
854             /// ```
855             ///
856             /// It is recommended to use a buffered reader to avoid excessive
857             /// syscalls.
858             ///
859             /// # Errors
860             ///
861             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
862             ///
863             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
864             ///
865             /// # Examples
866             ///
867             /// Read unsigned 32-bit little-endian integers from a `AsyncRead`:
868             ///
869             /// ```rust
870             /// use tokio::io::{self, AsyncReadExt};
871             ///
872             /// use std::io::Cursor;
873             ///
874             /// #[tokio::main]
875             /// async fn main() -> io::Result<()> {
876             ///     let mut reader = Cursor::new(vec![0x00, 0x00, 0x01, 0x0b]);
877             ///
878             ///     assert_eq!(184614912, reader.read_u32_le().await?);
879             ///     Ok(())
880             /// }
881             /// ```
882             fn read_u32_le(&mut self) -> ReadU32Le;
883 
884             /// Reads a signed 32-bit integer in little-endian order from the
885             /// underlying reader.
886             ///
887             ///
888             /// Equivalent to:
889             ///
890             /// ```ignore
891             /// async fn read_i32_le(&mut self) -> io::Result<i32>;
892             /// ```
893             ///
894             /// It is recommended to use a buffered reader to avoid excessive
895             /// syscalls.
896             ///
897             /// # Errors
898             ///
899             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
900             ///
901             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
902             ///
903             /// # Examples
904             ///
905             /// Read signed 32-bit little-endian integers from a `AsyncRead`:
906             ///
907             /// ```rust
908             /// use tokio::io::{self, AsyncReadExt};
909             ///
910             /// use std::io::Cursor;
911             ///
912             /// #[tokio::main]
913             /// async fn main() -> io::Result<()> {
914             ///     let mut reader = Cursor::new(vec![0xff, 0xff, 0x7a, 0x33]);
915             ///
916             ///     assert_eq!(863698943, reader.read_i32_le().await?);
917             ///     Ok(())
918             /// }
919             /// ```
920             fn read_i32_le(&mut self) -> ReadI32Le;
921 
922             /// Reads an unsigned 64-bit integer in little-endian order from the
923             /// underlying reader.
924             ///
925             /// Equivalent to:
926             ///
927             /// ```ignore
928             /// async fn read_u64_le(&mut self) -> io::Result<u64>;
929             /// ```
930             ///
931             /// It is recommended to use a buffered reader to avoid excessive
932             /// syscalls.
933             ///
934             /// # Errors
935             ///
936             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
937             ///
938             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
939             ///
940             /// # Examples
941             ///
942             /// Read unsigned 64-bit little-endian integers from a `AsyncRead`:
943             ///
944             /// ```rust
945             /// use tokio::io::{self, AsyncReadExt};
946             ///
947             /// use std::io::Cursor;
948             ///
949             /// #[tokio::main]
950             /// async fn main() -> io::Result<()> {
951             ///     let mut reader = Cursor::new(vec![
952             ///         0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83
953             ///     ]);
954             ///
955             ///     assert_eq!(9477368352180732672, reader.read_u64_le().await?);
956             ///     Ok(())
957             /// }
958             /// ```
959             fn read_u64_le(&mut self) -> ReadU64Le;
960 
961             /// Reads an signed 64-bit integer in little-endian order from the
962             /// underlying reader.
963             ///
964             /// Equivalent to:
965             ///
966             /// ```ignore
967             /// async fn read_i64_le(&mut self) -> io::Result<i64>;
968             /// ```
969             ///
970             /// It is recommended to use a buffered reader to avoid excessive
971             /// syscalls.
972             ///
973             /// # Errors
974             ///
975             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
976             ///
977             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
978             ///
979             /// # Examples
980             ///
981             /// Read signed 64-bit little-endian integers from a `AsyncRead`:
982             ///
983             /// ```rust
984             /// use tokio::io::{self, AsyncReadExt};
985             ///
986             /// use std::io::Cursor;
987             ///
988             /// #[tokio::main]
989             /// async fn main() -> io::Result<()> {
990             ///     let mut reader = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0]);
991             ///
992             ///     assert_eq!(128, reader.read_i64_le().await?);
993             ///     Ok(())
994             /// }
995             /// ```
996             fn read_i64_le(&mut self) -> ReadI64Le;
997 
998             /// Reads an unsigned 128-bit integer in little-endian order from the
999             /// underlying reader.
1000             ///
1001             /// Equivalent to:
1002             ///
1003             /// ```ignore
1004             /// async fn read_u128_le(&mut self) -> io::Result<u128>;
1005             /// ```
1006             ///
1007             /// It is recommended to use a buffered reader to avoid excessive
1008             /// syscalls.
1009             ///
1010             /// # Errors
1011             ///
1012             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
1013             ///
1014             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
1015             ///
1016             /// # Examples
1017             ///
1018             /// Read unsigned 128-bit little-endian integers from a `AsyncRead`:
1019             ///
1020             /// ```rust
1021             /// use tokio::io::{self, AsyncReadExt};
1022             ///
1023             /// use std::io::Cursor;
1024             ///
1025             /// #[tokio::main]
1026             /// async fn main() -> io::Result<()> {
1027             ///     let mut reader = Cursor::new(vec![
1028             ///         0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83,
1029             ///         0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83
1030             ///     ]);
1031             ///
1032             ///     assert_eq!(174826588484952389081207917399662330624, reader.read_u128_le().await?);
1033             ///     Ok(())
1034             /// }
1035             /// ```
1036             fn read_u128_le(&mut self) -> ReadU128Le;
1037 
1038             /// Reads an signed 128-bit integer in little-endian order from the
1039             /// underlying reader.
1040             ///
1041             /// Equivalent to:
1042             ///
1043             /// ```ignore
1044             /// async fn read_i128_le(&mut self) -> io::Result<i128>;
1045             /// ```
1046             ///
1047             /// It is recommended to use a buffered reader to avoid excessive
1048             /// syscalls.
1049             ///
1050             /// # Errors
1051             ///
1052             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
1053             ///
1054             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
1055             ///
1056             /// # Examples
1057             ///
1058             /// Read signed 128-bit little-endian integers from a `AsyncRead`:
1059             ///
1060             /// ```rust
1061             /// use tokio::io::{self, AsyncReadExt};
1062             ///
1063             /// use std::io::Cursor;
1064             ///
1065             /// #[tokio::main]
1066             /// async fn main() -> io::Result<()> {
1067             ///     let mut reader = Cursor::new(vec![
1068             ///         0x80, 0, 0, 0, 0, 0, 0, 0,
1069             ///         0, 0, 0, 0, 0, 0, 0, 0
1070             ///     ]);
1071             ///
1072             ///     assert_eq!(128, reader.read_i128_le().await?);
1073             ///     Ok(())
1074             /// }
1075             /// ```
1076             fn read_i128_le(&mut self) -> ReadI128Le;
1077 
1078             /// Reads an 32-bit floating point type in little-endian order from the
1079             /// underlying reader.
1080             ///
1081             /// Equivalent to:
1082             ///
1083             /// ```ignore
1084             /// async fn read_f32_le(&mut self) -> io::Result<f32>;
1085             /// ```
1086             ///
1087             /// It is recommended to use a buffered reader to avoid excessive
1088             /// syscalls.
1089             ///
1090             /// # Errors
1091             ///
1092             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
1093             ///
1094             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
1095             ///
1096             /// # Examples
1097             ///
1098             /// Read 32-bit floating point type from a `AsyncRead`:
1099             ///
1100             /// ```rust
1101             /// use tokio::io::{self, AsyncReadExt};
1102             ///
1103             /// use std::io::Cursor;
1104             ///
1105             /// #[tokio::main]
1106             /// async fn main() -> io::Result<()> {
1107             ///     let mut reader = Cursor::new(vec![0xff, 0xff, 0x7f, 0xff]);
1108             ///
1109             ///     assert_eq!(f32::MIN, reader.read_f32_le().await?);
1110             ///     Ok(())
1111             /// }
1112             /// ```
1113             fn read_f32_le(&mut self) -> ReadF32Le;
1114 
1115             /// Reads an 64-bit floating point type in little-endian order from the
1116             /// underlying reader.
1117             ///
1118             /// Equivalent to:
1119             ///
1120             /// ```ignore
1121             /// async fn read_f64_le(&mut self) -> io::Result<f64>;
1122             /// ```
1123             ///
1124             /// It is recommended to use a buffered reader to avoid excessive
1125             /// syscalls.
1126             ///
1127             /// # Errors
1128             ///
1129             /// This method returns the same errors as [`AsyncReadExt::read_exact`].
1130             ///
1131             /// [`AsyncReadExt::read_exact`]: AsyncReadExt::read_exact
1132             ///
1133             /// # Examples
1134             ///
1135             /// Read 64-bit floating point type from a `AsyncRead`:
1136             ///
1137             /// ```rust
1138             /// use tokio::io::{self, AsyncReadExt};
1139             ///
1140             /// use std::io::Cursor;
1141             ///
1142             /// #[tokio::main]
1143             /// async fn main() -> io::Result<()> {
1144             ///     let mut reader = Cursor::new(vec![
1145             ///         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff
1146             ///     ]);
1147             ///
1148             ///     assert_eq!(f64::MIN, reader.read_f64_le().await?);
1149             ///     Ok(())
1150             /// }
1151             /// ```
1152             fn read_f64_le(&mut self) -> ReadF64Le;
1153         }
1154 
1155         /// Reads all bytes until EOF in this source, placing them into `buf`.
1156         ///
1157         /// Equivalent to:
1158         ///
1159         /// ```ignore
1160         /// async fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize>;
1161         /// ```
1162         ///
1163         /// All bytes read from this source will be appended to the specified
1164         /// buffer `buf`. This function will continuously call [`read()`] to
1165         /// append more data to `buf` until [`read()`] returns `Ok(0)`.
1166         ///
1167         /// If successful, the total number of bytes read is returned.
1168         ///
1169         /// [`read()`]: AsyncReadExt::read
1170         ///
1171         /// # Errors
1172         ///
1173         /// If a read error is encountered then the `read_to_end` operation
1174         /// immediately completes. Any bytes which have already been read will
1175         /// be appended to `buf`.
1176         ///
1177         /// # Examples
1178         ///
1179         /// [`File`][crate::fs::File]s implement `Read`:
1180         ///
1181         /// ```no_run
1182         /// use tokio::io::{self, AsyncReadExt};
1183         /// use tokio::fs::File;
1184         ///
1185         /// #[tokio::main]
1186         /// async fn main() -> io::Result<()> {
1187         ///     let mut f = File::open("foo.txt").await?;
1188         ///     let mut buffer = Vec::new();
1189         ///
1190         ///     // read the whole file
1191         ///     f.read_to_end(&mut buffer).await?;
1192         ///     Ok(())
1193         /// }
1194         /// ```
1195         ///
1196         /// (See also the [`tokio::fs::read`] convenience function for reading from a
1197         /// file.)
1198         ///
1199         /// [`tokio::fs::read`]: fn@crate::fs::read
1200         fn read_to_end<'a>(&'a mut self, buf: &'a mut Vec<u8>) -> ReadToEnd<'a, Self>
1201         where
1202             Self: Unpin,
1203         {
1204             read_to_end(self, buf)
1205         }
1206 
1207         /// Reads all bytes until EOF in this source, appending them to `buf`.
1208         ///
1209         /// Equivalent to:
1210         ///
1211         /// ```ignore
1212         /// async fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize>;
1213         /// ```
1214         ///
1215         /// If successful, the number of bytes which were read and appended to
1216         /// `buf` is returned.
1217         ///
1218         /// # Errors
1219         ///
1220         /// If the data in this stream is *not* valid UTF-8 then an error is
1221         /// returned and `buf` is unchanged.
1222         ///
1223         /// See [`read_to_end`][AsyncReadExt::read_to_end] for other error semantics.
1224         ///
1225         /// # Examples
1226         ///
1227         /// [`File`][crate::fs::File]s implement `Read`:
1228         ///
1229         /// ```no_run
1230         /// use tokio::io::{self, AsyncReadExt};
1231         /// use tokio::fs::File;
1232         ///
1233         /// #[tokio::main]
1234         /// async fn main() -> io::Result<()> {
1235         ///     let mut f = File::open("foo.txt").await?;
1236         ///     let mut buffer = String::new();
1237         ///
1238         ///     f.read_to_string(&mut buffer).await?;
1239         ///     Ok(())
1240         /// }
1241         /// ```
1242         ///
1243         /// (See also the [`crate::fs::read_to_string`] convenience function for
1244         /// reading from a file.)
1245         ///
1246         /// [`crate::fs::read_to_string`]: fn@crate::fs::read_to_string
1247         fn read_to_string<'a>(&'a mut self, dst: &'a mut String) -> ReadToString<'a, Self>
1248         where
1249             Self: Unpin,
1250         {
1251             read_to_string(self, dst)
1252         }
1253 
1254         /// Creates an adaptor which reads at most `limit` bytes from it.
1255         ///
1256         /// This function returns a new instance of `AsyncRead` which will read
1257         /// at most `limit` bytes, after which it will always return EOF
1258         /// (`Ok(0)`). Any read errors will not count towards the number of
1259         /// bytes read and future calls to [`read()`] may succeed.
1260         ///
1261         /// [`read()`]: fn@crate::io::AsyncReadExt::read
1262         ///
1263         /// [read]: AsyncReadExt::read
1264         ///
1265         /// # Examples
1266         ///
1267         /// [`File`][crate::fs::File]s implement `Read`:
1268         ///
1269         /// ```no_run
1270         /// use tokio::io::{self, AsyncReadExt};
1271         /// use tokio::fs::File;
1272         ///
1273         /// #[tokio::main]
1274         /// async fn main() -> io::Result<()> {
1275         ///     let f = File::open("foo.txt").await?;
1276         ///     let mut buffer = [0; 5];
1277         ///
1278         ///     // read at most five bytes
1279         ///     let mut handle = f.take(5);
1280         ///
1281         ///     handle.read(&mut buffer).await?;
1282         ///     Ok(())
1283         /// }
1284         /// ```
1285         fn take(self, limit: u64) -> Take<Self>
1286         where
1287             Self: Sized,
1288         {
1289             take(self, limit)
1290         }
1291     }
1292 }
1293 
1294 impl<R: AsyncRead + ?Sized> AsyncReadExt for R {}
1295