zff/header/version1/
compression_header.rs

1// - STD
2use std::io::{Cursor};
3
4// - internal
5use 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/// Header for the data compression parameters.\
20/// This header is part of the main header.
21#[derive(Debug,Clone)]
22pub struct CompressionHeader {
23	version: u8,
24	algorithm: CompressionAlgorithm,
25	level: u8,
26	threshold: f32,
27}
28
29impl CompressionHeader {
30	/// returns a new compression header with the given values.
31	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	/// Returns the compression algorithm. The appropriate algorithms/values
41	/// could be found at [CompressionAlgorithm](enum.CompressionAlgorithm.html).
42	pub fn algorithm(&self) -> &CompressionAlgorithm {
43		&self.algorithm
44	}
45
46	/// returns the compression level.
47	pub fn level(&self) -> &u8 {
48		&self.level
49	}
50
51	/// returns the compression threshold
52	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}