use std::io::{BufWriter, Error, Write};
#[cfg(feature = "flate2")]
use flate2::{write::GzEncoder, Compression};
#[derive(Debug)]
pub enum BufferedWriter<W: Write> {
Plain(BufWriter<W>),
#[cfg(feature = "flate2")]
Gz(BufWriter<GzEncoder<W>>),
}
impl<W: Write> BufferedWriter<W> {
pub fn plain(w: W) -> Self {
Self::Plain(BufWriter::new(w))
}
#[cfg(feature = "flate2")]
pub fn gzip(w: W, compression_level: u32) -> Self {
Self::Gz(BufWriter::new(GzEncoder::new(
w,
Compression::new(compression_level),
)))
}
}
impl<W: Write> Write for BufferedWriter<W> {
fn write(&mut self, buf: &[u8]) -> Result<usize, Error> {
match self {
Self::Plain(ref mut writer) => writer.write(buf),
#[cfg(feature = "flate2")]
Self::Gz(ref mut writer) => writer.write(buf),
}
}
fn flush(&mut self) -> Result<(), Error> {
match self {
Self::Plain(ref mut writer) => writer.flush(),
#[cfg(feature = "flate2")]
Self::Gz(ref mut writer) => writer.flush(),
}
}
}