compression_codecs/lz4/
params.rs1use 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#[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 pub fn block_size(mut self, block_size: BlockSize) -> Self {
43 self.block_size = Some(block_size);
44 self
45 }
46
47 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 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}