use mismall::stream::{Compressor, Decompressor};
use std::error::Error;
use std::io::{self, Cursor, Read, Write};
fn main() -> Result<(), Box<dyn Error>> {
println!("=== Streaming Compression Example ===");
let test_data =
b"This is some test data that we'll compress using the streaming API.\n".repeat(100);
println!("Created {} bytes of test data", test_data.len());
println!("\nCompressing with streaming API...");
let compressed_buffer = Vec::new();
let mut cursor = Cursor::new(compressed_buffer);
{
let mut compressor = Compressor::new(&mut cursor, "stream_test.txt", None::<&str>);
compressor.write_all(&test_data)?;
compressor.finish()?;
}
let compressed_buffer = cursor.into_inner();
println!(
"Compressed to {} bytes (ratio: {:.1}%)",
compressed_buffer.len(),
(compressed_buffer.len() as f64 / test_data.len() as f64) * 100.0
);
println!("\nDecompressing with streaming API...");
let mut compressed_cursor = Cursor::new(&compressed_buffer);
let mut decompressor = Decompressor::new(&mut compressed_cursor, None::<&str>);
let mut decompressed_data = Vec::new();
decompressor.read_to_end(&mut decompressed_data)?;
println!("Decompressed to {} bytes", decompressed_data.len());
if test_data == decompressed_data {
println!("✅ Streaming compression/decompression successful!");
} else {
println!("❌ Data mismatch after streaming operations!");
}
println!("\n--- File Streaming Example ---");
std::fs::write("stream_input.txt", &test_data)?;
let output_file = std::fs::File::create("stream_output.small")?;
let mut file_compressor = Compressor::new(output_file, "stream_input.txt", None::<&str>);
let mut input_file = std::fs::File::open("stream_input.txt")?;
io::copy(&mut input_file, &mut file_compressor)?;
file_compressor.finish()?;
println!("File compression completed");
let compressed_file = std::fs::File::open("stream_output.small")?;
let mut file_decompressor = Decompressor::new(compressed_file, None::<&str>);
let mut output_restored = std::fs::File::create("stream_restored.txt")?;
io::copy(&mut file_decompressor, &mut output_restored)?;
println!("File decompression completed");
let original = std::fs::read_to_string("stream_input.txt")?;
let restored = std::fs::read_to_string("stream_restored.txt")?;
if original == restored {
println!("✅ File streaming compression/decompression successful!");
} else {
println!("❌ File content mismatch!");
}
std::fs::remove_file("stream_input.txt")?;
std::fs::remove_file("stream_output.small")?;
std::fs::remove_file("stream_restored.txt")?;
println!("\n✅ All streaming operations completed successfully!");
Ok(())
}