age_core/
io.rs

1//! Common helpers for performing I/O.
2
3use std::io::{self, Read, Stderr, Write};
4
5use io_tee::{TeeReader, TeeWriter};
6
7#[cfg(feature = "plugin")]
8use io_tee::{ReadExt, WriteExt};
9
10/// A wrapper around a reader that optionally tees its input to `stderr` for this process.
11pub 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
37/// A wrapper around a writer that optionally tees its output to `stderr` for this process.
38pub 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}