| pub use flate2::{Decompress, Status}; |
| |
| /// non-streaming interfaces for decompression |
| pub mod inflate { |
| /// The error returned by various [Inflate methods][super::Inflate] |
| #[derive(Debug, thiserror::Error)] |
| #[allow(missing_docs)] |
| pub enum Error { |
| #[error("Could not write all bytes when decompressing content")] |
| WriteInflated(#[from] std::io::Error), |
| #[error("Could not decode zip stream, status was '{0:?}'")] |
| Inflate(#[from] flate2::DecompressError), |
| #[error("The zlib status indicated an error, status was '{0:?}'")] |
| Status(flate2::Status), |
| } |
| } |
| |
| /// Decompress a few bytes of a zlib stream without allocation |
| pub struct Inflate { |
| /// The actual decompressor doing all the work. |
| pub state: Decompress, |
| } |
| |
| impl Default for Inflate { |
| fn default() -> Self { |
| Inflate { |
| state: Decompress::new(true), |
| } |
| } |
| } |
| |
| impl Inflate { |
| /// Run the decompressor exactly once. Cannot be run multiple times |
| pub fn once(&mut self, input: &[u8], out: &mut [u8]) -> Result<(flate2::Status, usize, usize), inflate::Error> { |
| let before_in = self.state.total_in(); |
| let before_out = self.state.total_out(); |
| let status = self.state.decompress(input, out, flate2::FlushDecompress::None)?; |
| Ok(( |
| status, |
| (self.state.total_in() - before_in) as usize, |
| (self.state.total_out() - before_out) as usize, |
| )) |
| } |
| |
| /// Ready this instance for decoding another data stream. |
| pub fn reset(&mut self) { |
| self.state.reset(true); |
| } |
| } |
| |
| /// |
| pub mod stream; |