compression_codecs/lz4/
params.rs

1//! This module contains lz4-specific types for async-compression.
2
3use std::convert::TryInto;
4
5use compression_core::Level;
6pub use lz4::liblz4::BlockSize;
7use lz4::{
8    liblz4::{BlockChecksum, FrameType, LZ4FFrameInfo, LZ4FPreferences},
9    BlockMode, ContentChecksum,
10};
11
12/// lz4 compression parameters builder. This is a stable wrapper around lz4's own encoder
13/// params type, to abstract over different versions of the lz4 library.
14///
15/// See the [lz4 documentation](https://github.com/lz4/lz4/blob/dev/doc/lz4frame_manual.html)
16/// for more information on these parameters.
17///
18/// # Examples
19///
20/// ```
21/// use compression_codecs::lz4;
22///
23/// let params = lz4::params::EncoderParams::default()
24///     .block_size(lz4::params::BlockSize::Max1MB)
25///     .content_checksum(true);
26/// ```
27#[derive(Clone, Debug, Default)]
28pub struct EncoderParams {
29    block_size: Option<BlockSize>,
30    block_checksum: Option<BlockChecksum>,
31    content_checksum: Option<ContentChecksum>,
32    level: Level,
33}
34
35impl EncoderParams {
36    pub fn level(mut self, level: Level) -> Self {
37        self.level = level;
38        self
39    }
40
41    /// Sets input block size.
42    pub fn block_size(mut self, block_size: BlockSize) -> Self {
43        self.block_size = Some(block_size);
44        self
45    }
46
47    /// Add a 32-bit checksum of frame's decompressed data.
48    pub fn content_checksum(mut self, enable: bool) -> Self {
49        self.content_checksum = Some(if enable {
50            ContentChecksum::ChecksumEnabled
51        } else {
52            ContentChecksum::NoChecksum
53        });
54        self
55    }
56
57    /// Each block followed by a checksum of block's compressed data.
58    pub fn block_checksum(mut self, enable: bool) -> Self {
59        self.block_checksum = Some(if enable {
60            BlockChecksum::BlockChecksumEnabled
61        } else {
62            BlockChecksum::NoBlockChecksum
63        });
64        self
65    }
66}
67
68impl From<EncoderParams> for LZ4FPreferences {
69    fn from(value: EncoderParams) -> Self {
70        let block_size_id = value.block_size.clone().unwrap_or(BlockSize::Default);
71        let content_checksum_flag = value
72            .content_checksum
73            .clone()
74            .unwrap_or(ContentChecksum::NoChecksum);
75        let block_checksum_flag = value
76            .block_checksum
77            .clone()
78            .unwrap_or(BlockChecksum::NoBlockChecksum);
79        let compression_level = match value.level {
80            Level::Fastest => 0,
81            Level::Best => 12,
82            Level::Precise(quality) => quality.try_into().unwrap_or(0).clamp(0, 12),
83            _ => 0,
84        };
85
86        LZ4FPreferences {
87            frame_info: LZ4FFrameInfo {
88                block_size_id,
89                block_mode: BlockMode::Linked,
90                content_checksum_flag,
91                frame_type: FrameType::Frame,
92                content_size: 0,
93                dict_id: 0,
94                block_checksum_flag,
95            },
96            compression_level,
97            auto_flush: 0,
98            favor_dec_speed: 0,
99            reserved: [0; 3],
100        }
101    }
102}