use std::fmt::Debug;
use better_io::BetterBufRead;
use crate::bit_reader::BitReaderBuilder;
use crate::data_types::{LatentType, Number};
use crate::errors::PcoResult;
use crate::metadata::chunk::ChunkMeta;
use crate::metadata::format_version::FormatVersion;
use crate::wrapped::chunk_decompressor::ChunkDecompressor;
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct FileDecompressor {
format_version: FormatVersion,
}
impl FileDecompressor {
pub fn new<R: BetterBufRead>(src: R) -> PcoResult<(Self, R)> {
let mut reader_builder = BitReaderBuilder::new(src);
let format_version = reader_builder.with_reader(
FormatVersion::MAX_ENCODED_SIZE,
FormatVersion::read_from,
)?;
Ok((
Self { format_version },
reader_builder.into_inner(),
))
}
pub fn format_version(&self) -> &FormatVersion {
&self.format_version
}
pub fn chunk_decompressor<T: Number, R: BetterBufRead>(
&self,
src: R,
) -> PcoResult<(ChunkDecompressor<T>, R)> {
let latent_type = LatentType::new::<T::L>();
let (chunk_meta, rest) = ChunkMeta::read_from::<R>(src, &self.format_version, latent_type)?;
let cd = ChunkDecompressor::new(chunk_meta)?;
Ok((cd, rest))
}
}