git_features/zlib/
mod.rs

1pub use flate2::{Decompress, Status};
2
3/// non-streaming interfaces for decompression
4pub mod inflate {
5    use quick_error::quick_error;
6    quick_error! {
7        /// The error returned by various [Inflate methods][super::Inflate]
8        #[allow(missing_docs)]
9        #[derive(Debug)]
10        pub enum Error {
11            WriteInflated(err: std::io::Error) {
12                display("Could not write all bytes when decompressing content")
13                from()
14            }
15            Inflate(err: flate2::DecompressError) {
16                display("Could not decode zip stream, status was '{:?}'", err)
17                from()
18            }
19            Status(status: flate2::Status) {
20                display("The zlib status indicated an error, status was '{:?}'", status)
21            }
22        }
23    }
24}
25
26/// Decompress a few bytes of a zlib stream without allocation
27pub struct Inflate {
28    /// The actual decompressor doing all the work.
29    pub state: Decompress,
30}
31
32impl Default for Inflate {
33    fn default() -> Self {
34        Inflate {
35            state: Decompress::new(true),
36        }
37    }
38}
39
40impl Inflate {
41    /// Run the decompressor exactly once. Cannot be run multiple times
42    pub fn once(&mut self, input: &[u8], out: &mut [u8]) -> Result<(flate2::Status, usize, usize), inflate::Error> {
43        let before_in = self.state.total_in();
44        let before_out = self.state.total_out();
45        let status = self.state.decompress(input, out, flate2::FlushDecompress::None)?;
46        Ok((
47            status,
48            (self.state.total_in() - before_in) as usize,
49            (self.state.total_out() - before_out) as usize,
50        ))
51    }
52}
53
54///
55pub mod stream;