mid_compression/
interface.rs

1use enum_dispatch::enum_dispatch;
2
3/// Interface for the decompressor.
4#[enum_dispatch(PolyDecompressor)]
5pub trait IDecompressor: Send {
6    /// Tries to retrieve decompressed size of the buffer.
7    fn try_decompressed_size(
8        &self,
9        of: &[u8],
10    ) -> Result<usize, crate::error::SizeRetrievalError>;
11
12    /// Tries to decompress supplied `buffer` into the `to`
13    /// Vec.
14    ///
15    /// Maximum decompression size is assumed to be
16    /// `Vec::capacity`
17    fn try_decompress(
18        &mut self,
19        buffer: &[u8],
20        to: &mut Vec<u8>,
21    ) -> Result<usize, crate::error::DecompressError>;
22}
23
24/// Interface for the compressor.
25#[enum_dispatch(PolyCompressor)]
26pub trait ICompressor {
27    /// Get compression level of this compressor.
28    fn level(&self) -> usize;
29
30    /// Set compression level of this compressor.
31    fn set_level(&mut self, level: usize);
32
33    /// Tries to compress buffer `buf` to the `preallocated`
34    /// `Vec`.
35    ///
36    /// Maximum compressed size is assumed to be
37    /// `Vec::capacity`.
38    fn try_compress(
39        &mut self,
40        buf: &[u8],
41        preallocated: &mut Vec<u8>,
42    ) -> Result<std::num::NonZeroUsize, crate::error::CompressError>;
43
44    /// Get backend's supported compression levels.
45    fn supported_levels(&self) -> std::ops::RangeInclusive<usize>;
46}
47
48impl IDecompressor for () {
49    fn try_decompressed_size(
50        &self,
51        _of: &[u8],
52    ) -> Result<usize, crate::error::SizeRetrievalError> {
53        unimplemented!()
54    }
55
56    fn try_decompress(
57        &mut self,
58        _buffer: &[u8],
59        _to: &mut Vec<u8>,
60    ) -> Result<usize, crate::error::DecompressError> {
61        unimplemented!()
62    }
63}
64
65impl ICompressor for () {
66    fn level(&self) -> usize {
67        0
68    }
69
70    fn set_level(&mut self, _level: usize) {}
71
72    fn try_compress(
73        &mut self,
74        _buf: &[u8],
75        _preallocated: &mut Vec<u8>,
76    ) -> Result<std::num::NonZeroUsize, crate::error::CompressError> {
77        unimplemented!()
78    }
79
80    fn supported_levels(&self) -> std::ops::RangeInclusive<usize> {
81        unimplemented!()
82    }
83}