zff/header/version1/
compression_header.rs1use std::io::{Cursor};
3
4use crate::{
6 Result,
7 ZffError,
8 HeaderCoding,
9 ValueEncoder,
10 ValueDecoder,
11 CompressionAlgorithm,
12};
13
14use crate::version1::{
15 HEADER_IDENTIFIER_COMPRESSION_HEADER,
16 ERROR_HEADER_DECODER_COMPRESSION_ALGORITHM,
17};
18
19#[derive(Debug,Clone)]
22pub struct CompressionHeader {
23 version: u8,
24 algorithm: CompressionAlgorithm,
25 level: u8,
26 threshold: f32,
27}
28
29impl CompressionHeader {
30 pub fn new(version: u8,compression_algo: CompressionAlgorithm, level: u8, threshold: f32) -> CompressionHeader {
32 Self {
33 version,
34 algorithm: compression_algo,
35 level,
36 threshold,
37 }
38 }
39
40 pub fn algorithm(&self) -> &CompressionAlgorithm {
43 &self.algorithm
44 }
45
46 pub fn level(&self) -> &u8 {
48 &self.level
49 }
50
51 pub fn threshold(&self) -> f32 {
53 self.threshold
54 }
55}
56
57impl HeaderCoding for CompressionHeader {
58 type Item = CompressionHeader;
59
60 fn identifier() -> u32 {
61 HEADER_IDENTIFIER_COMPRESSION_HEADER
62 }
63
64 fn version(&self) -> u8 {
65 self.version
66 }
67
68 fn encode_header(&self) -> Vec<u8> {
69 let mut vec = vec![self.version, self.algorithm.clone() as u8, self.level];
70 vec.append(&mut self.threshold.encode_directly());
71
72 vec
73 }
74
75 fn decode_content(data: Vec<u8>) -> Result<CompressionHeader> {
76 let mut cursor = Cursor::new(data);
77 let version = u8::decode_directly(&mut cursor)?;
78 let algorithm = match u8::decode_directly(&mut cursor) {
79 Ok(0) => CompressionAlgorithm::None,
80 Ok(1) => CompressionAlgorithm::Zstd,
81 Ok(2) => CompressionAlgorithm::Lz4,
82 _ => return Err(ZffError::new_header_decode_error(ERROR_HEADER_DECODER_COMPRESSION_ALGORITHM))
83 };
84 let level = u8::decode_directly(&mut cursor)?;
85 let threshold = f32::decode_directly(&mut cursor)?;
86 Ok(CompressionHeader::new(version, algorithm, level, threshold))
87 }
88}