libflate/deflate/
mod.rs

1//! The encoder and decoder of the DEFLATE format and algorithm.
2//!
3//! The DEFLATE is defined in [RFC-1951](https://tools.ietf.org/html/rfc1951).
4//!
5//! # Examples
6//! ```
7//! use core2::io::{Read, Write};
8//! use libflate::deflate::{Encoder, Decoder};
9//!
10//! // Encoding
11//! let mut encoder = Encoder::new(Vec::new());
12//! encoder.write_all(b"Hello World!".as_ref()).unwrap();
13//! let encoded_data = encoder.finish().into_result().unwrap();
14//!
15//! // Decoding
16//! let mut decoder = Decoder::new(&encoded_data[..]);
17//! let mut decoded_data = Vec::new();
18//! decoder.read_to_end(&mut decoded_data).unwrap();
19//!
20//! assert_eq!(decoded_data, b"Hello World!");
21//! ```
22pub use self::decode::Decoder;
23pub use self::encode::EncodeOptions;
24pub use self::encode::Encoder;
25pub use self::encode::DEFAULT_BLOCK_SIZE;
26
27mod decode;
28mod encode;
29pub(crate) mod symbol;
30
31#[cfg(test)]
32pub(crate) mod test_data;
33
34#[derive(Debug, Clone, Copy)]
35enum BlockType {
36    Raw = 0b00,
37    Fixed = 0b01,
38    Dynamic = 0b10,
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use crate::lz77;
45    use alloc::vec::Vec;
46    use core2::io::{Read, Write};
47
48    #[test]
49    fn encode_and_decode_works() {
50        let plain = (0..lz77::MAX_DISTANCE as u32 * 32)
51            .map(|i| i as u8)
52            .collect::<Vec<_>>();
53
54        let buffer = Vec::new();
55        let mut encoder = Encoder::new(buffer);
56        encoder.write_all(&plain[..]).expect("encode");
57        let encoded = encoder.finish().into_result().unwrap();
58
59        let mut buffer = Vec::new();
60        let mut decoder = Decoder::new(&encoded[..]);
61        decoder.read_to_end(&mut buffer).expect("decode");
62
63        assert_eq!(buffer, plain);
64    }
65}