compression_codecs/deflate64/
decoder.rs1use crate::Decode;
2use compression_core::util::PartialBuffer;
3use deflate64::InflaterManaged;
4use std::io::{Error, ErrorKind, Result};
5
6#[derive(Debug)]
7pub struct Deflate64Decoder {
8 inflater: Box<InflaterManaged>,
9}
10
11impl Default for Deflate64Decoder {
12 fn default() -> Self {
13 Self {
14 inflater: Box::new(InflaterManaged::new()),
15 }
16 }
17}
18
19impl Deflate64Decoder {
20 pub fn new() -> Self {
21 Self::default()
22 }
23
24 fn decode(
25 &mut self,
26 input: &mut PartialBuffer<impl AsRef<[u8]>>,
27 output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
28 ) -> Result<bool> {
29 let result = self
30 .inflater
31 .inflate(input.unwritten(), output.unwritten_mut());
32
33 input.advance(result.bytes_consumed);
34 output.advance(result.bytes_written);
35
36 if result.data_error {
37 Err(Error::new(ErrorKind::InvalidData, "invalid data"))
38 } else {
39 Ok(self.inflater.finished() && self.inflater.available_output() == 0)
40 }
41 }
42}
43
44impl Decode for Deflate64Decoder {
45 fn reinit(&mut self) -> Result<()> {
46 self.inflater = Box::new(InflaterManaged::new());
47 Ok(())
48 }
49
50 fn decode(
51 &mut self,
52 input: &mut PartialBuffer<impl AsRef<[u8]>>,
53 output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
54 ) -> Result<bool> {
55 self.decode(input, output)
56 }
57
58 fn flush(
59 &mut self,
60 output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
61 ) -> Result<bool> {
62 self.decode(&mut PartialBuffer::new([]), output)?;
63
64 loop {
65 let old_len = output.written().len();
66 self.decode(&mut PartialBuffer::new([]), output)?;
67 if output.written().len() == old_len {
68 break;
69 }
70 }
71
72 Ok(!output.unwritten().is_empty())
73 }
74
75 fn finish(
76 &mut self,
77 output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
78 ) -> Result<bool> {
79 self.decode(&mut PartialBuffer::new([]), output)
80 }
81}