diff options
Diffstat (limited to 'vendor/gix-features/src/zlib/mod.rs')
-rw-r--r-- | vendor/gix-features/src/zlib/mod.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/vendor/gix-features/src/zlib/mod.rs b/vendor/gix-features/src/zlib/mod.rs new file mode 100644 index 000000000..8dcdfd93f --- /dev/null +++ b/vendor/gix-features/src/zlib/mod.rs @@ -0,0 +1,47 @@ +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, + )) + } +} + +/// +pub mod stream; |