# zune-inflate This crate features an optimized inflate algorithm supporting whole buffer decompression. Supported formats are - raw deflate - zlib (deflate with a zlib wrapper on) - gzip The implementation is heavily based on Eric Biggers [libdeflate] and hence has similar characteristics. Specifically, we do not support streaming decompression but prefer whole buffer decompression. ## Installation To use in your crate, simply add the following in your Cargo.toml ```toml [dependencies] #other amazing crates from other amazing people zune-inflate = "0.2.0" ``` ## Features One can enable or disable a specific format using cargo features. Specifically, the following can be enabled - `gzip`: Enable decompressing of gzip encoded data - `zlib`: Enable decompressing of zlib encoded data To enable one feature, modify `Cargo.toml` entry to be ```toml [dependencies] zune-inflate = { version = "0.2", default-features = false, features = ["#ADD_SPECIFIC_FEATURE"] } ``` ## Usage. The library exposes a simple API for decompressing data, and depending on what type of data you have, you typically choose one of the `decode[_suffix]` function to decode your data The decompressor expects the whole buffer handed upfront ### Decoding raw deflate To decode raw deflate data, the following code should get you started. ```rust use zune_inflate::DeflateDecoder; let totally_valid_data = [0; 23]; let mut decoder = DeflateDecoder::new( & totally_valid_data); // panic on errors, because that's the cool way to go let decompressed_data = decoder.decode_deflate().unwrap(); ``` ### Decoding zlib To decode deflate data wrapped in zlib, the following code should get you started. ```rust use zune_inflate::DeflateDecoder; let totally_valid_data = [0; 23]; let mut decoder = DeflateDecoder::new( & totally_valid_data); // panic on errors, because that's the cool way to go let decompressed_data = decoder.decode_zlib().unwrap(); ``` ### Advanced usage There are advanced options specified by `DeflateOptions` which can change decompression settings. ## Comparisions. I'll compare this with `flate2` with `miniz-oxide` backend. | feature | `zune-inflate` | `flate2` | |-------------------------|----------------|-------------------| | zlib decompression | yes | yes | | delfate decompression | yes | yes | | gzip | yes | yes | | compression | soon | yes | | streaming decompression | no | yes | | **unsafe** | no | yes[1] | [1] Flate writes to an uninitialized buffer As you can see, there are some concrete features we currently lack when compared to flate2/miniz-oxide. There's actually nothing riding in for us, except...it's wickedly fast... ### Benchmarks Up-to date benchmarks are done using criterion and hosted online at [zune-benchmarks] site, benchmarks for this library have the `inflate: ` prefix. ## Fuzzing The decoder is currently fuzzed for correctness by both `miniz-oxide` and `zlib-ng`, see the fuzz/src directory [libdeflater]: https://github.com/adamkewley/libdeflater [libdeflate]:https://github.com/ebiggers/libdeflate [criterion]:https://github.com/bheisler/criterion.rs [zune-benchmarks]:https://etemesi254.github.io/posts/Zune-Benchmarks/