micromegas_telemetry/
compression.rs

1use anyhow::{Context, Result};
2use std::io::Read;
3use std::io::Write;
4
5/// Compresses a byte slice using LZ4.
6///
7/// The compression level is set to 10 for a good balance between speed and compression ratio.
8pub fn compress(src: &[u8]) -> Result<Vec<u8>> {
9    let mut compressed = Vec::new();
10    let mut encoder = lz4::EncoderBuilder::new()
11        .level(10)
12        .build(&mut compressed)
13        .with_context(|| "allocating lz4 encoder")?;
14    let _size = encoder
15        .write(src)
16        .with_context(|| "writing to lz4 encoder")?;
17    let (_writer, res) = encoder.finish();
18    res.with_context(|| "closing lz4 encoder")?;
19    Ok(compressed)
20}
21
22/// Decompresses a LZ4-compressed byte slice.
23///
24/// This function will allocate a new `Vec<u8>` to hold the decompressed data.
25pub fn decompress(compressed: &[u8]) -> Result<Vec<u8>> {
26    let mut decompressed = Vec::new();
27    let mut decoder = lz4::Decoder::new(compressed).with_context(|| "allocating lz4 decoder")?;
28    let _size = decoder
29        .read_to_end(&mut decompressed)
30        .with_context(|| "reading lz4-compressed buffer")?;
31    let (_reader, res) = decoder.finish();
32    res?;
33    Ok(decompressed)
34}