Expand description
Intelligent compression for MediaGit
This crate provides compression abstractions and implementations:
- Smart compression: Automatic per-object-type strategy selection
- Zstd compression: Fast, good compression ratios (default)
- Brotli compression: Higher compression, slower (for archival)
- Auto-detection: Transparently handle compressed vs uncompressed data
- Compression levels: Configurable speed vs compression trade-offs
§Quick Start
§Basic Compression
use mediagit_compression::{Compressor, CompressionLevel, ZstdCompressor};
fn main() -> anyhow::Result<()> {
let compressor = ZstdCompressor::new(CompressionLevel::Default);
let original = b"Hello, World!";
let compressed = compressor.compress(original)?;
let decompressed = compressor.decompress(&compressed)?;
assert_eq!(original, &decompressed[..]);
println!("Original: {} bytes, Compressed: {} bytes",
original.len(), compressed.len());
Ok(())
}§Smart Type-Aware Compression
use mediagit_compression::{SmartCompressor, TypeAwareCompressor, ObjectType};
fn main() -> anyhow::Result<()> {
let compressor = SmartCompressor::new();
// Automatically selects best strategy based on file type
let text_data = b"Some text content...";
let compressed = compressor.compress_typed(text_data, ObjectType::Text)?;
// Already compressed formats stored without recompression (with Store prefix)
let jpeg_data = vec![0xFF, 0xD8, 0xFF, 0xE0];
let stored = compressor.compress_typed(&jpeg_data, ObjectType::Jpeg)?;
assert_eq!(stored[0], 0x00); // Store mode magic byte
assert_eq!(&stored[1..], &jpeg_data[..]); // No recompression overhead
Ok(())
}§Compression Algorithms
§Zstd (Default)
- Fast compression and decompression
- Good compression ratios (typical 2-4x for text/structured data)
- Low memory usage
- Ideal for frequently accessed data
§Brotli
- Higher compression ratios (typical 3-8x for text/structured data)
- Slower compression but faster decompression than gzip
- Good for archival and infrequently accessed data
- Higher memory usage during compression
§Per-Object Type Strategies
SmartCompressor automatically selects optimal compression:
- Already compressed (JPEG, PNG, MP4, ZIP): Store without recompression
- Uncompressed images (TIFF, BMP, PSD, RAW): Zstd Best compression
- Text/Code (TXT, JSON, XML, YAML): Brotli Best for maximum text compression
- Documents (PDF, SVG): Zstd Default for balanced performance
- Unknown/Binary: Zstd Default as safe fallback
Re-exports§
pub use adaptive::calculate_entropy;pub use adaptive::AdaptiveCompressor;pub use adaptive::CompressionStrategy as AdaptiveStrategy;pub use adaptive::EntropyClass;pub use adaptive::FileProfile;pub use adaptive::PatternClass;pub use adaptive::PerformanceStats;pub use adaptive::SizeClass;pub use brotli_compressor::BrotliCompressor;pub use error::CompressionError;pub use error::CompressionResult;pub use metrics::AggregatedStats;pub use metrics::CompressionMetrics;pub use metrics::MetricsAggregator;pub use per_type_compressor::CompressionProfile;pub use per_type_compressor::PerObjectTypeCompressor;pub use per_type_compressor::PerTypeStats;pub use smart_compressor::CompressionStrategy;pub use smart_compressor::ObjectCategory;pub use smart_compressor::ObjectType;pub use smart_compressor::SmartCompressor;pub use smart_compressor::TypeAwareCompressor;pub use zlib_compressor::ZlibCompressor;pub use zstd_compressor::ZstdCompressor;
Modules§
- adaptive
- Adaptive compression based on file characteristics
- brotli_
compressor - Brotli compression implementation
- delta
- Delta encoding implementation using bsdiff
- error
- Compression error types
- metrics
- Compression metrics and statistics
- per_
type_ compressor - Per-object-type compression with configurable profiles
- smart_
compressor - Smart compression with per-object-type strategy selection
- zlib_
compressor - Zlib compression implementation for Git compatibility
- zstd_
compressor - Zstd compression implementation
Enums§
- Compression
Algorithm - Compression algorithm identifier
- Compression
Level - Compression level configuration
Traits§
- Compressor
- Compressor trait for pluggable compression implementations