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