use flate2::read::GzDecoder;
use std::io::Seek;
use std::io::Cursor;
#[derive(Debug)]
pub enum GzReader<R> {
GzReader(Cursor<Box<[u8]>>),
Reader(R),
}
impl<R> Read for GzReader<R>
where
R: Read,
{
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
match self {
GzReader::GzReader(r) => r.read(buf),
GzReader::Reader(r) => r.read(buf),
}
}
}
impl<R> Seek for GzReader<R>
where
R: Read + Seek,
{
fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> {
match self {
GzReader::GzReader(r) => r.seek(pos),
GzReader::Reader(r) => r.seek(pos),
}
}
}
use std::fmt::Debug;
use std::io::Read;
use crate::error::Error;
use std::io::SeekFrom;
impl<R> GzReader<R>
where
R: Read + Seek,
{
pub fn new(reader: R) -> Result<Self, Error> {
let mut gz = GzDecoder::new(reader);
match gz.header() {
Some(_) => {
let mut buf = vec![];
gz.read_to_end(&mut buf)?;
Ok(GzReader::GzReader(Cursor::new(buf.into_boxed_slice())))
}
None => {
let mut r = gz.into_inner();
r.seek(SeekFrom::Start(0))?;
Ok(GzReader::Reader(r))
}
}
}
}