use {crate::error::Result, std::io::Read};
pub mod builder;
pub mod reader;
pub enum DebCompression {
Uncompressed,
Gzip,
Xz(u32),
Zstandard(i32),
}
impl DebCompression {
pub fn extension(&self) -> &'static str {
match self {
Self::Uncompressed => "",
Self::Gzip => ".gz",
Self::Xz(_) => ".xz",
Self::Zstandard(_) => ".zst",
}
}
pub fn compress(&self, reader: &mut impl Read) -> Result<Vec<u8>> {
let mut buffer = vec![];
match self {
Self::Uncompressed => {
std::io::copy(reader, &mut buffer)?;
}
Self::Gzip => {
let header = libflate::gzip::HeaderBuilder::new().finish();
let mut encoder = libflate::gzip::Encoder::with_options(
&mut buffer,
libflate::gzip::EncodeOptions::new().header(header),
)?;
std::io::copy(reader, &mut encoder)?;
encoder.finish().into_result()?;
}
Self::Xz(level) => {
let mut encoder = xz2::write::XzEncoder::new(buffer, *level);
std::io::copy(reader, &mut encoder)?;
buffer = encoder.finish()?;
}
Self::Zstandard(level) => {
let mut encoder = zstd::Encoder::new(buffer, *level)?;
std::io::copy(reader, &mut encoder)?;
buffer = encoder.finish()?;
}
}
Ok(buffer)
}
}