use super::{
algorithms::{deflate, deflate_zlib, lzma},
Method,
};
use dh::{Readable, Writable};
use std::io::{Error, ErrorKind, Result};
pub fn decompress<'a, W: Writable<'a>>(
reader: &'a mut dyn Readable<'a>,
offset: u64,
size: u64,
method: &Method,
target: &mut W,
buffer_size: u64,
) -> Result<u64> {
use Method::*;
match method {
None => {
reader.copy_at(offset, size, target, buffer_size)?;
Ok(size)
}
Lzma => {
let mut source = reader.limit(offset, size)?;
let size = lzma::decompress(&mut source, target)?;
Ok(size)
}
Deflate => {
let mut source = reader.limit(offset, size)?;
let size = deflate::decompress(&mut source, target)?;
Ok(size)
}
DeflateZlib => {
let mut source = reader.limit(offset, size)?;
let size = deflate_zlib::decompress(&mut source, target)?;
Ok(size)
}
_ => Err(Error::new(
ErrorKind::Unsupported,
"Unsupported compression method",
)),
}
}