1use std::io::{self, Read, Stderr, Write};
4
5use io_tee::{TeeReader, TeeWriter};
6
7#[cfg(feature = "plugin")]
8use io_tee::{ReadExt, WriteExt};
9
10pub enum DebugReader<R: Read> {
12 Off(R),
13 On(TeeReader<R, Stderr>),
14}
15
16impl<R: Read> DebugReader<R> {
17 #[cfg(feature = "plugin")]
18 #[cfg_attr(docsrs, doc(cfg(feature = "plugin")))]
19 pub(crate) fn new(reader: R, debug_enabled: bool) -> Self {
20 if debug_enabled {
21 DebugReader::On(reader.tee_dbg())
22 } else {
23 DebugReader::Off(reader)
24 }
25 }
26}
27
28impl<R: Read> Read for DebugReader<R> {
29 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
30 match self {
31 Self::Off(reader) => reader.read(buf),
32 Self::On(reader) => reader.read(buf),
33 }
34 }
35}
36
37pub enum DebugWriter<W: Write> {
39 Off(W),
40 On(TeeWriter<W, Stderr>),
41}
42
43impl<W: Write> DebugWriter<W> {
44 #[cfg(feature = "plugin")]
45 #[cfg_attr(docsrs, doc(cfg(feature = "plugin")))]
46 pub(crate) fn new(writer: W, debug_enabled: bool) -> Self {
47 if debug_enabled {
48 DebugWriter::On(writer.tee_dbg())
49 } else {
50 DebugWriter::Off(writer)
51 }
52 }
53}
54
55impl<W: Write> Write for DebugWriter<W> {
56 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
57 match self {
58 Self::Off(writer) => writer.write(buf),
59 Self::On(writer) => writer.write(buf),
60 }
61 }
62
63 fn flush(&mut self) -> io::Result<()> {
64 match self {
65 Self::Off(writer) => writer.flush(),
66 Self::On(writer) => writer.flush(),
67 }
68 }
69}