use crate::CompressError;
use oxiarc_deflate::{deflate, inflate};
const DEFAULT_LEVEL: u8 = 6;
const MAX_LEVEL: u32 = 9;
#[derive(Debug, Clone, Copy, Default)]
pub struct OxiArcCodec {
level: u8,
}
impl OxiArcCodec {
#[must_use]
pub const fn new() -> Self {
Self {
level: DEFAULT_LEVEL,
}
}
#[must_use]
pub const fn with_level(level: u8) -> Self {
let clamped = if level > 9 { 9 } else { level };
Self { level: clamped }
}
pub fn new_with_level(level: u32) -> Result<Self, CompressError> {
if level > MAX_LEVEL {
return Err(CompressError::InvalidLevel(level));
}
Ok(Self { level: level as u8 })
}
pub fn compress(&self, data: &[u8]) -> Result<Vec<u8>, CompressError> {
deflate(data, self.level).map_err(|e| CompressError::Compress(e.to_string()))
}
pub fn decompress(&self, data: &[u8]) -> Result<Vec<u8>, CompressError> {
inflate(data).map_err(|e| CompressError::Decompress(e.to_string()))
}
pub fn decompress_into(data: &[u8], out: &mut Vec<u8>) -> Result<(), CompressError> {
let decompressed = inflate(data).map_err(|e| CompressError::Decompress(e.to_string()))?;
out.extend_from_slice(&decompressed);
Ok(())
}
pub fn compress_with_hint(
&self,
data: &[u8],
_size_hint: usize,
) -> Result<Vec<u8>, CompressError> {
self.compress(data)
}
#[must_use]
pub const fn algorithm_name(&self) -> &'static str {
"DEFLATE"
}
#[must_use]
pub const fn compression_level(&self) -> Option<u8> {
Some(self.level)
}
}