use crate::file::is_compressed;
use crate::model::VolumeHeaderRecord;
use crate::result::{Error, Result};
use std::io::Read;
pub fn decompress_file(data: &[u8]) -> Result<Vec<u8>> {
if !is_compressed(data) {
return Err(Error::DecompressionError(
"Cannot decompress uncompressed data".into(),
));
};
let mut decompressed_buffer = Vec::new();
let header_size = std::mem::size_of::<VolumeHeaderRecord>();
let (header, mut reader) = data.split_at(header_size);
decompressed_buffer.extend_from_slice(&header);
loop {
reader = reader.split_at(4).1;
let mut decoder = bzip2::read::BzDecoder::new(reader);
let mut block_buffer = Vec::new();
decoder.read_to_end(&mut block_buffer)?;
reader = reader.split_at(decoder.total_in() as usize).1;
decompressed_buffer.extend(block_buffer);
if reader.len() == 0 {
break;
}
}
Ok(decompressed_buffer)
}