log4rs/
priv_io.rs

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}