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