pub mod dict;
pub mod header;
pub mod literal;
pub mod r#match;
use std::io::Read;
use lzma_rust2::LzmaReader;
use crate::error::{LazippyError, LazippyResult};
pub fn decode(input: &[u8]) -> LazippyResult<Vec<u8>> {
let props = header::parse_header(input)?;
let uncompressed_size = props.uncompressed_size.unwrap_or(u64::MAX);
let compressed = &input[13..];
decode_raw(
compressed,
props.lc as u32,
props.lp as u32,
props.pb as u32,
props.dict_size,
uncompressed_size,
)
}
pub fn decode_7z(
input: &[u8],
props_bytes: &[u8],
uncompressed_size: u64,
) -> LazippyResult<Vec<u8>> {
let (props_byte, dict_size) = header::parse_7z_props(props_bytes)?;
let mut reader =
LzmaReader::new_with_props(input, uncompressed_size, props_byte, dict_size, None)
.map_err(|e| LazippyError::Backend(e.to_string()))?;
let mut out = Vec::with_capacity(uncompressed_size.min(256 * 1024 * 1024) as usize);
reader
.read_to_end(&mut out)
.map_err(|e| LazippyError::Backend(e.to_string()))?;
Ok(out)
}
fn decode_raw(
input: &[u8],
lc: u32,
lp: u32,
pb: u32,
dict_size: u32,
uncompressed_size: u64,
) -> LazippyResult<Vec<u8>> {
let mut reader = LzmaReader::new(input, uncompressed_size, lc, lp, pb, dict_size, None)
.map_err(|e| LazippyError::Backend(e.to_string()))?;
let mut out = Vec::with_capacity(uncompressed_size.min(256 * 1024 * 1024) as usize);
reader
.read_to_end(&mut out)
.map_err(|e| LazippyError::Backend(e.to_string()))?;
Ok(out)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decode_empty_returns_error() {
let result = decode(&[]);
assert!(result.is_err());
}
}