#[cfg(feature = "heatshrink")]
mod imp {
use std::io::Cursor;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum HeatshrinkError {
#[error("invalid heatshrink parameters: window={window}, lookahead={lookahead}")]
InvalidParameters {
window: u8,
lookahead: u8,
},
}
pub fn compress(input: &[u8], window: u8, lookahead: u8) -> Result<Vec<u8>, HeatshrinkError> {
validate(window, lookahead)?;
let mut input_cursor = Cursor::new(input);
let mut output = Vec::with_capacity(input.len());
embedded_heatshrink::encode(window, lookahead, &mut input_cursor, &mut output);
Ok(output)
}
pub fn decompress(input: &[u8], window: u8, lookahead: u8) -> Result<Vec<u8>, HeatshrinkError> {
validate(window, lookahead)?;
let mut input_cursor = Cursor::new(input);
let mut output = Vec::with_capacity(input.len() * 2);
embedded_heatshrink::decode(window, lookahead, &mut input_cursor, &mut output);
Ok(output)
}
fn validate(window: u8, lookahead: u8) -> Result<(), HeatshrinkError> {
use embedded_heatshrink::{
HEATSHRINK_MAX_WINDOW_BITS, HEATSHRINK_MIN_LOOKAHEAD_BITS, HEATSHRINK_MIN_WINDOW_BITS,
};
if !(HEATSHRINK_MIN_WINDOW_BITS..=HEATSHRINK_MAX_WINDOW_BITS).contains(&window)
|| lookahead < HEATSHRINK_MIN_LOOKAHEAD_BITS
|| lookahead >= window
{
return Err(HeatshrinkError::InvalidParameters { window, lookahead });
}
Ok(())
}
}
#[cfg(feature = "heatshrink")]
pub use imp::{compress, decompress, HeatshrinkError};