diff --git a/src/io/read/mod.rs b/src/io/read/mod.rs index 56f632356..f9b4a9304 100644 --- a/src/io/read/mod.rs +++ b/src/io/read/mod.rs @@ -323,7 +323,7 @@ extension_trait! { ```no_run # fn main() -> std::io::Result<()> { async_std::task::block_on(async { # - use async_std::prelude::*; + use async_std::io::prelude::*; use async_std::fs::File; let mut f = File::open("foo.txt").await?; @@ -331,7 +331,7 @@ extension_trait! { let mut other_buffer = Vec::new(); { - let reference = f.by_ref(); + let reference = ReadExt::by_ref(&mut f); // read at most 5 bytes reference.take(5).read_to_end(&mut buffer).await?; @@ -486,7 +486,7 @@ mod tests { let mut other_buffer = Vec::new(); { - let reference = f.by_ref(); + let reference = io::read::ReadExt::by_ref(&mut f); // read at most 5 bytes assert_eq!(reference.take(5).read_to_end(&mut buffer).await?, 5); diff --git a/src/io/write/mod.rs b/src/io/write/mod.rs index eb114344a..e4fe551c3 100644 --- a/src/io/write/mod.rs +++ b/src/io/write/mod.rs @@ -201,6 +201,43 @@ extension_trait! { WriteAllFuture { writer: self, buf } } + + #[doc = r#" + Creates a "by reference" adaptor for this instance of `Write`. + + The returned adaptor also implements `Write` and will simply borrow this + current writer. + + # Examples + + [`File`][file]s implement `Write`: + + [file]: ../fs/struct.File.html + + ```no_run + # fn main() -> std::io::Result<()> { async_std::task::block_on(async { + # + use async_std::io::prelude::*; + use async_std::fs::File; + + let mut f = File::open("foo.txt").await?; + + { + let reference = WriteExt::by_ref(&mut f); + + // read at most 5 bytes + reference.write_all(b"hello ").await?; + + } // drop our &mut reference so we can use f again + + // original file still usable, read the rest + f.write_all(b"world").await?; + # + # Ok(()) }) } + ``` + "#] + fn by_ref(&mut self) -> &mut Self where Self: Sized { self } + #[doc = r#" Writes a formatted string into this writer, returning any error encountered. @@ -322,3 +359,29 @@ extension_trait! { } } } + + +#[cfg(test)] +mod tests { + use crate::io; + use crate::prelude::*; + + #[test] + fn test_write_by_ref() -> io::Result<()> { + crate::task::block_on(async { + let mut f = io::Cursor::new(vec![]); + + { + let reference = io::write::WriteExt::by_ref(&mut f); + + reference.write_all(b"hello").await?; + } // drop our &mut reference so we can use f again + + assert_eq!(f.position(), 5); + // original file still usable, read the rest + f.write_all(b" world").await?; + assert_eq!(f.position(), 11); + Ok(()) + }) + } +} \ No newline at end of file