1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
//!Rust Compression library with generic interface
//!
//!## API
//!
//!API is mostly thin layer that provides uniform behavior for all algorithms the best it can.
//!
//!Please read documentation to see how to use:
//!
//!- [Decoder](decoder/struct.Decoder.html)
//!- [Encoder](encoder/struct.Encoder.html)
//!
//!## Features
//!
//!All features are off by default.
//!This crate requires `alloc` to be available with system allocator set.
//!
//!- `brotli-c` - Enables `brotli` interface using C library.
//!- `brotli-rust` - Enables `brotli` interface using pure Rust library.
//!- `zlib-ng` - Enables `zlib-ng` interface.
//!- `zlib` - Enables `zlib` interface.
//!- `zlib-static` - Enables `zlib` interface with `static` feature.
//!- `zstd` - Enables `zstd` interface.
//!
//!## Usage
//!
//!### Decode
//!
//!Minimal example of using Decoder.
//!Use [Interface](decoder/struct.Interface.html) to create instance.
//!
//!If you unsure about compression used, you can try [detect](decoder/enum.Detection.html#method.detect) it
//!
//!```rust,no_run
//!use compu::{Decoder, DecodeStatus, DecodeError};
//!
//!fn example(decoder: &mut Decoder, input: &[u8]) -> Result<Vec<u8>, DecodeError> {
//! let mut output = Vec::with_capacity(1024);
//! loop {
//! let result = decoder.decode_vec(input, &mut output).status?;
//! match result {
//! DecodeStatus::NeedInput => panic!("Not enough input, incomplete data?"),
//! //If you need more output, please allocate spare capacity.
//! //API never allocates, only you allocate
//! DecodeStatus::NeedOutput => output.reserve(1024),
//! DecodeStatus::Finished => {
//! //Make sure to reset state, if you want to re-use decoder.
//! decoder.reset();
//! break Ok(output)
//! }
//! }
//! }
//!}
//!```
//!
//!### Encode
//!
//!Minimal example of using Encoder.
//!Use [Interface](encoder/struct.Interface.html) to create instance.
//!
//!```rust,no_run
//!use compu::{Encoder, EncodeStatus, EncodeOp};
//!
//!fn example(encoder: &mut Encoder, input: &[u8]) -> Vec<u8> {
//! let mut output = Vec::with_capacity(1024);
//! loop {
//! let result = encoder.encode_vec(input, &mut output, EncodeOp::Finish).status;
//! match result {
//! //This status is returned by any other `EncodeOp` except `Finish
//! EncodeStatus::Continue => panic!("I wanted to finish but continue!?"),
//! //If you need more output, please allocate spare capacity.
//! //API never allocates, only you allocate
//! EncodeStatus::NeedOutput => output.reserve(1024),
//! //If you have enough space, `EncodeOp::Finish` will result in this operation
//! EncodeStatus::Finished => {
//! //Make sure to reset state, if you want to re-use it.
//! encoder.reset();
//! break output;
//! }
//! //Generally can indicate internal error likely due to OOM condition.
//! //Note that all wrappers ensure that Rust's global allocator is used,
//! //so take care if you use custom one
//! //Generally should not happen, so it is ok to just panic
//! //but be a good boy and return error properly if it happens, even if it is unlikely
//! EncodeStatus::Error => {
//! panic!("unlikely")
//! }
//! }
//! }
//!}
//!```
#![no_std]
#![warn(missing_docs)]
#![cfg_attr(feature = "cargo-clippy", allow(clippy::style))]
#![cfg_attr(feature = "cargo-clippy", allow(clippy::derivable_impls))]
#[cfg(any(feature = "zlib", feature = "zlib-static", feature = "zlib-ng", feature = "brotli-c", feature = "zstd"))]
pub(crate) mod utils;
pub mod decoder;
pub use decoder::{Decoder, Decode, DecodeStatus, DecodeError, Detection};
pub mod encoder;
pub use encoder::{Encoder, Encode, EncodeOp, EncodeStatus};
pub mod mem;