diff --git a/README.md b/README.md index d83646a..f758d32 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Tee -[![Build Status](https://travis-ci.org/softprops/tee.svg)](https://travis-ci.org/softprops/tee) [![Coverage Status](https://coveralls.io/repos/softprops/tee/badge.svg?branch=master&service=github)](https://coveralls.io/github/softprops/tee?branch=master) +[![Build Status](https://travis-ci.org/softprops/tee.svg)](https://travis-ci.org/softprops/tee) [![Coverage Status](https://coveralls.io/repos/softprops/tee/badge.svg?branch=master&service=github)](https://coveralls.io/github/softprops/tee?branch=master) [![Docs](https://docs.rs/tee/badge.svg)](https://docs.rs/tee) A rustlang adapter for readers which delegate read bytes to a writer, adapted from the standard library's `std::io::Read#tee` which has since been deprecated. @@ -31,4 +31,6 @@ With `tee`, this looks more like let tee_reader = tee::TeeReader::new(reader, writer); ``` +However, importing `TeeExt` will allow usage exactly like the original stdlib function. + Doug Tangren (softprops) 2015 diff --git a/src/lib.rs b/src/lib.rs index 5647556..5885d1f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,21 @@ +//! An adapter for objects implementing `Read` which copies read bytes and writes them to a +//! provided reader. +//! +//! # Example +//! +//! ```rust +//! # extern crate tee; +//! use std::io::Read; +//! use tee::TeeExt; +//! # fn main() { +//! let reader = "It's over 9000!".as_bytes(); +//! let mut teeout = Vec::new(); +//! let mut stdout = Vec::new(); +//! reader.tee(&mut teeout).read_to_end(&mut stdout).unwrap(); +//! assert_eq!(teeout, stdout); +//! # } +//! ``` + use std::io::{Read, Result, Write}; /// An adapter for readers whose inputs @@ -13,6 +31,7 @@ impl TeeReader { /// writer. The write operation must complete before the read completes. /// /// Errors reported by the write operation will be interpreted as errors for the read + #[inline] pub fn new(reader: R, writer: W) -> TeeReader { TeeReader { reader: reader, @@ -22,6 +41,7 @@ impl TeeReader { } impl Read for TeeReader { + #[inline] fn read(&mut self, buf: &mut [u8]) -> Result { let n = try!(self.reader.read(buf)); try!(self.writer.write_all(&buf[..n])); @@ -29,6 +49,19 @@ impl Read for TeeReader { } } +/// An extension trait, allowing `.tee()` to be constructed in the same manner as the old +/// `std::io::Tee`. +pub trait TeeExt: Sized + Read { + fn tee(self, writer: W) -> TeeReader; +} + +impl TeeExt for R { + #[inline] + fn tee(self, writer: W) -> TeeReader { + TeeReader::new(self, writer) + } +} + #[cfg(test)] mod tests { use super::*; @@ -45,4 +78,13 @@ mod tests { } assert_eq!(teeout, stdout); } + + #[test] + fn tee_ext() { + let reader = "It's over 9000!".as_bytes(); + let mut teeout = Vec::new(); + let mut stdout = Vec::new(); + reader.tee(&mut teeout).read_to_end(&mut stdout).unwrap(); + assert_eq!(teeout, stdout); + } }