1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
use std::fmt; use std::io::{self, Stderr, StderrLock, Stdout, StdoutLock}; pub enum StdWriter { Stdout(Stdout), Stderr(Stderr), } impl StdWriter { pub fn stdout() -> StdWriter { StdWriter::Stdout(io::stdout()) } pub fn stderr() -> StdWriter { StdWriter::Stderr(io::stderr()) } pub fn lock(&self) -> StdWriterLock { match *self { StdWriter::Stdout(ref w) => StdWriterLock::Stdout(w.lock()), StdWriter::Stderr(ref w) => StdWriterLock::Stderr(w.lock()), } } } impl io::Write for StdWriter { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { match *self { StdWriter::Stdout(ref mut w) => w.write(buf), StdWriter::Stderr(ref mut w) => w.write(buf), } } fn flush(&mut self) -> io::Result<()> { match *self { StdWriter::Stdout(ref mut w) => w.flush(), StdWriter::Stderr(ref mut w) => w.flush(), } } fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { match *self { StdWriter::Stdout(ref mut w) => w.write_all(buf), StdWriter::Stderr(ref mut w) => w.write_all(buf), } } fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> { match *self { StdWriter::Stdout(ref mut w) => w.write_fmt(fmt), StdWriter::Stderr(ref mut w) => w.write_fmt(fmt), } } } pub enum StdWriterLock<'a> { Stdout(StdoutLock<'a>), Stderr(StderrLock<'a>), } impl<'a> io::Write for StdWriterLock<'a> { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { match *self { StdWriterLock::Stdout(ref mut w) => w.write(buf), StdWriterLock::Stderr(ref mut w) => w.write(buf), } } fn flush(&mut self) -> io::Result<()> { match *self { StdWriterLock::Stdout(ref mut w) => w.flush(), StdWriterLock::Stderr(ref mut w) => w.flush(), } } fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { match *self { StdWriterLock::Stdout(ref mut w) => w.write_all(buf), StdWriterLock::Stderr(ref mut w) => w.write_all(buf), } } fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> { match *self { StdWriterLock::Stdout(ref mut w) => w.write_fmt(fmt), StdWriterLock::Stderr(ref mut w) => w.write_fmt(fmt), } } }