compression_codecs/deflate64/
decoder.rs

1use 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}