use std::io::{Read, Write};
use flate2::{read::GzDecoder, write::GzEncoder, Compression};
use miette::IntoDiagnostic;
use crate::{Buffer, BufferAtom};
pub fn compress(data: &[BufferAtom]) -> miette::Result<Buffer> {
let uncompressed_size = data.len();
let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
encoder.write_all(data).into_diagnostic()?;
let it = encoder.finish().into_diagnostic();
let compressed_size = it.as_ref().map(|it| it.len()).unwrap_or(0);
tracing::info!(
"Compression: {:.2} kb -> {:.2} kb ({:.2}%)",
uncompressed_size as f64 / 1000.0,
compressed_size as f64 / 1000.0,
(compressed_size as f64 / uncompressed_size as f64) * 100.0
);
it
}
pub fn decompress(data: &[BufferAtom]) -> miette::Result<Buffer> {
let compressed_size = data.len();
let mut decoder = GzDecoder::new(data);
let mut decompressed_data = Vec::new();
decoder
.read_to_end(&mut decompressed_data)
.into_diagnostic()?;
let uncompressed_size = decompressed_data.len();
tracing::info!(
"Decompression: {:.2} kb -> {:.2} kb ({:.2}%)",
uncompressed_size as f64 / 1000.0,
compressed_size as f64 / 1000.0,
(compressed_size as f64 / uncompressed_size as f64) * 100.0
);
Ok(decompressed_data)
}