#[cfg(not(feature = "no_std"))]
use mbrotli::io::FinishError;
#[cfg(not(feature = "no_std"))]
use mbrotli::{Compressor, EncoderConfig, InputSize, Quality, StreamConfig};
#[cfg(not(feature = "no_std"))]
use std::io::{Read, Write};
#[cfg(not(feature = "no_std"))]
fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = EncoderConfig::default().with_quality(Quality::Q5);
let mut encoder = Compressor::new(config)?;
let payload = "brotli ".repeat(1000);
let compressed = encoder.compress(payload.as_bytes())?;
println!("one-shot: {} -> {} bytes", payload.len(), compressed.len());
let mut output = Vec::new();
for _ in 0..3 {
output.clear();
let range = encoder.compress_into(payload.as_bytes(), &mut output)?;
assert_eq!(&output[range], compressed.as_slice());
}
println!("appended: {} bytes, into a reused buffer", output.len());
let bound = Compressor::max_compressed_size(payload.len())?;
let mut buffer = vec![0u8; bound];
let written = encoder.compress_to_slice(payload.as_bytes(), &mut buffer)?;
assert_eq!(&buffer[..written], compressed.as_slice());
println!("to slice: {written} bytes into a {bound} byte buffer");
let stream = StreamConfig::from(InputSize::Exact(payload.len() as u64));
let mut sink = encoder.writer(Vec::new(), stream)?;
for chunk in payload.as_bytes().chunks(512) {
sink.write_all(chunk)?;
}
let streamed = sink.finish().map_err(FinishError::into_error)?;
assert_eq!(streamed, compressed);
println!("writer: {} bytes", streamed.len());
let pulled = {
let mut source = encoder.reader(payload.as_bytes(), stream)?;
let mut pulled = Vec::new();
source.read_to_end(&mut pulled)?;
pulled
};
assert_eq!(pulled, compressed);
println!("reader: {} bytes", pulled.len());
println!(
"retained: {} bytes of reusable workspace",
encoder.retained_bytes()
);
Ok(())
}
#[cfg(feature = "no_std")]
fn main() {}