pub mod cdict;
pub mod compress;
pub mod decompress;
pub mod header;
pub mod types;
pub use cdict::Lz4FCDict;
pub use compress::{
lz4f_compress_begin, lz4f_compress_bound, lz4f_compress_end, lz4f_compress_frame,
lz4f_compress_frame_using_cdict, lz4f_compress_update, lz4f_create_compression_context,
lz4f_flush, lz4f_free_compression_context, lz4f_uncompressed_update, CompressOptions,
};
pub use decompress::{
lz4f_create_decompression_context, lz4f_decompress, lz4f_decompress_using_dict,
lz4f_free_decompression_context, lz4f_get_frame_info, lz4f_header_size,
lz4f_reset_decompression_context, DecompressOptions, Lz4FDCtx,
};
pub use header::lz4f_compress_frame_bound;
pub use types::{
BlockChecksum, BlockMode, BlockSizeId, ContentChecksum, FrameInfo, FrameType, Lz4FCCtx,
Lz4FError, Preferences,
};
pub fn compress_frame_to_vec(data: &[u8]) -> Vec<u8> {
let prefs = types::Preferences::default();
let bound = header::lz4f_compress_frame_bound(data.len(), Some(&prefs));
let mut out = vec![0u8; bound];
match compress::lz4f_compress_frame(&mut out, data, Some(&prefs)) {
Ok(n) => {
out.truncate(n);
out
}
Err(_) => Vec::new(),
}
}
pub fn decompress_frame_to_vec(compressed: &[u8]) -> std::io::Result<Vec<u8>> {
let mut dctx = decompress::lz4f_create_decompression_context(types::LZ4F_VERSION)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, format!("{e:?}")))?;
let mut out = Vec::new();
let mut pos = 0usize;
let mut dst_buf = vec![0u8; 65536];
loop {
if pos >= compressed.len() {
break;
}
let (consumed, written, hint) =
decompress::lz4f_decompress(&mut dctx, Some(&mut dst_buf), &compressed[pos..], None)
.map_err(|e| {
std::io::Error::new(std::io::ErrorKind::InvalidData, format!("{e:?}"))
})?;
out.extend_from_slice(&dst_buf[..written]);
pos += consumed;
if hint == 0 {
break;
}
if consumed == 0 && written == 0 {
break;
}
}
Ok(out)
}