diff --git a/src/libstd/io/impls.rs b/src/libstd/io/impls.rs index 6b26c016638a7..0f26e4359bf41 100644 --- a/src/libstd/io/impls.rs +++ b/src/libstd/io/impls.rs @@ -229,6 +229,23 @@ impl Write for Vec { Ok(()) } + #[inline] + fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> { + struct Adaptor<'a>(&'a mut Vec); + + impl<'a> fmt::Write for Adaptor<'a> { + #[inline] + fn write_str(&mut self, s: &str) -> fmt::Result { + self.0.extend_from_slice(s.as_bytes()); + Ok(()) + } + } + + let mut output = Adaptor(self); + fmt::write(&mut output, fmt) + .map_err(|_| Error::new(ErrorKind::Other, "formatter error")) + } + #[inline] fn flush(&mut self) -> io::Result<()> { Ok(()) } } diff --git a/src/libstd/io/util.rs b/src/libstd/io/util.rs index 2c6880281b5e6..c74ab877994ef 100644 --- a/src/libstd/io/util.rs +++ b/src/libstd/io/util.rs @@ -10,7 +10,8 @@ #![allow(missing_copy_implementations)] -use io::{self, Read, Write, ErrorKind, BufRead}; +use io::{self, Read, Write, Error, ErrorKind, BufRead}; +use fmt; /// Copies the entire contents of a reader into a writer. /// @@ -161,8 +162,25 @@ pub fn sink() -> Sink { Sink { _priv: () } } #[stable(feature = "rust1", since = "1.0.0")] impl Write for Sink { + #[inline] fn write(&mut self, buf: &[u8]) -> io::Result { Ok(buf.len()) } + + #[inline] fn flush(&mut self) -> io::Result<()> { Ok(()) } + + #[inline] + fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> { + struct SinkAdapter; + impl fmt::Write for SinkAdapter { + fn write_str(&mut self, _: &str) -> fmt::Result { + Ok(()) + } + } + + let mut a = SinkAdapter; + fmt::write(&mut a, fmt) + .map_err(|_| Error::new(ErrorKind::Other, "formatter error")) + } } #[cfg(test)]