veilid-core 0.5.3

Core library used to create a Veilid node and operate it as part of an application
Documentation
use super::*;
use lz4_flex::block;

impl_veilid_log_facility!("compression");

#[cfg_attr(
    feature = "instrument",
    instrument(level = "trace", target = "compression", skip_all)
)]
#[must_use]
pub(crate) fn compress_prepend_size(input: &[u8]) -> Vec<u8> {
    block::compress_prepend_size(input)
}

#[cfg_attr(
    feature = "instrument",
    instrument(level = "trace", target = "compression", skip_all, err)
)]
pub(crate) fn decompress_size_prepended(
    input: &[u8],
    max_size: Option<usize>,
) -> VeilidAPIResult<Vec<u8>> {
    let (uncompressed_size, input) = match block::uncompressed_size(input) {
        Ok(v) => v,
        Err(e) => {
            apibail_generic!("failed to get uncompressed size: {}", e);
        }
    };
    if let Some(max_size) = max_size {
        if uncompressed_size > max_size {
            apibail_generic!(
                "decompression exceeded maximum size: {} > {}",
                uncompressed_size,
                max_size
            );
        }
    }
    match block::decompress(input, uncompressed_size) {
        Ok(v) => Ok(v),
        Err(e) => {
            apibail_generic!(
                "failed to decompress: {}:data_len={}\ndata={}\nbacktrace:\n{:#?}",
                e,
                input.len(),
                print_data(input, Some(256)),
                backtrace::Backtrace::new()
            );
        }
    }
}