marlin_binary_transfer/
compression.rs1#[cfg(feature = "heatshrink")]
13mod imp {
14 use std::io::Cursor;
15
16 use thiserror::Error;
17
18 #[derive(Debug, Error)]
20 pub enum HeatshrinkError {
21 #[error("invalid heatshrink parameters: window={window}, lookahead={lookahead}")]
24 InvalidParameters {
25 window: u8,
27 lookahead: u8,
29 },
30 }
31
32 pub fn compress(input: &[u8], window: u8, lookahead: u8) -> Result<Vec<u8>, HeatshrinkError> {
36 validate(window, lookahead)?;
37 let mut input_cursor = Cursor::new(input);
38 let mut output = Vec::with_capacity(input.len());
39 embedded_heatshrink::encode(window, lookahead, &mut input_cursor, &mut output);
40 Ok(output)
41 }
42
43 pub fn decompress(input: &[u8], window: u8, lookahead: u8) -> Result<Vec<u8>, HeatshrinkError> {
46 validate(window, lookahead)?;
47 let mut input_cursor = Cursor::new(input);
48 let mut output = Vec::with_capacity(input.len() * 2);
49 embedded_heatshrink::decode(window, lookahead, &mut input_cursor, &mut output);
50 Ok(output)
51 }
52
53 fn validate(window: u8, lookahead: u8) -> Result<(), HeatshrinkError> {
54 use embedded_heatshrink::{
55 HEATSHRINK_MAX_WINDOW_BITS, HEATSHRINK_MIN_LOOKAHEAD_BITS, HEATSHRINK_MIN_WINDOW_BITS,
56 };
57 if !(HEATSHRINK_MIN_WINDOW_BITS..=HEATSHRINK_MAX_WINDOW_BITS).contains(&window)
58 || lookahead < HEATSHRINK_MIN_LOOKAHEAD_BITS
59 || lookahead >= window
60 {
61 return Err(HeatshrinkError::InvalidParameters { window, lookahead });
62 }
63 Ok(())
64 }
65}
66
67#[cfg(feature = "heatshrink")]
68pub use imp::{compress, decompress, HeatshrinkError};