compression-rs 0.2.0

Safe Rust bindings for Apple's Compression and AppleArchive APIs on macOS
Documentation
mod common;

use common::pseudo_random_bytes;
use compression::{Algorithm, Decoder, Encoder};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let input = pseudo_random_bytes(64 * 1024);
    let split = input.len() / 2;

    let mut encoder = Encoder::new(Algorithm::Lzfse)?;
    let mut compressed = encoder.process(&input[..split])?;
    compressed.extend(encoder.process(&input[split..])?);
    compressed.extend(encoder.finish()?);

    let mut decoder = Decoder::new(Algorithm::Lzfse)?;
    let encoded_split = compressed.len() / 2;
    let mut round_trip = decoder.process(&compressed[..encoded_split])?;
    round_trip.extend(decoder.process(&compressed[encoded_split..])?);
    round_trip.extend(decoder.finish()?);

    assert_eq!(round_trip, input);
    let input_len = input.len();
    let compressed_len = compressed.len();
    println!("input={input_len} compressed={compressed_len}");
    println!("✅ compression stream round-trip OK");
    Ok(())
}