1 use crate::io::seek::{seek, Seek};
2 use crate::io::AsyncSeek;
3 use std::io::SeekFrom;
4 
5 /// An extension trait which adds utility methods to `AsyncSeek` types.
6 ///
7 /// # Examples
8 ///
9 /// ```
10 /// use std::io::{Cursor, SeekFrom};
11 /// use tokio::prelude::*;
12 ///
13 /// #[tokio::main]
14 /// async fn main() -> io::Result<()> {
15 ///     let mut cursor = Cursor::new(b"abcdefg");
16 ///
17 ///     // the `seek` method is defined by this trait
18 ///     cursor.seek(SeekFrom::Start(3)).await?;
19 ///
20 ///     let mut buf = [0; 1];
21 ///     let n = cursor.read(&mut buf).await?;
22 ///     assert_eq!(n, 1);
23 ///     assert_eq!(buf, [b'd']);
24 ///
25 ///     Ok(())
26 /// }
27 /// ```
28 pub trait AsyncSeekExt: AsyncSeek {
29     /// Creates a future which will seek an IO object, and then yield the
30     /// new position in the object and the object itself.
31     ///
32     /// In the case of an error the buffer and the object will be discarded, with
33     /// the error yielded.
34     ///
35     /// # Examples
36     ///
37     /// ```no_run
38     /// use tokio::fs::File;
39     /// use tokio::prelude::*;
40     ///
41     /// use std::io::SeekFrom;
42     ///
43     /// # async fn dox() -> std::io::Result<()> {
44     /// let mut file = File::open("foo.txt").await?;
45     /// file.seek(SeekFrom::Start(6)).await?;
46     ///
47     /// let mut contents = vec![0u8; 10];
48     /// file.read_exact(&mut contents).await?;
49     /// # Ok(())
50     /// # }
51     /// ```
seek(&mut self, pos: SeekFrom) -> Seek<'_, Self> where Self: Unpin,52     fn seek(&mut self, pos: SeekFrom) -> Seek<'_, Self>
53     where
54         Self: Unpin,
55     {
56         seek(self, pos)
57     }
58 }
59 
60 impl<S: AsyncSeek + ?Sized> AsyncSeekExt for S {}
61