use crate::map_error_code;
use std::io;
use zstd_safe;
#[derive(Default)]
pub struct Compressor<'a> {
context: zstd_safe::CCtx<'a>,
}
impl Compressor<'static> {
pub fn new(level: i32) -> io::Result<Self> {
Self::with_dictionary(level, &[])
}
pub fn with_dictionary(level: i32, dictionary: &[u8]) -> io::Result<Self> {
let mut compressor = Self::default();
compressor.set_dictionary(level, dictionary)?;
Ok(compressor)
}
}
impl<'a> Compressor<'a> {
pub fn with_prepared_dictionary<'b>(
dictionary: &'a crate::dict::EncoderDictionary<'b>,
) -> io::Result<Self>
where
'b: 'a,
{
let mut compressor = Self::default();
compressor.set_prepared_dictionary(dictionary)?;
Ok(compressor)
}
pub fn set_compression_level(&mut self, level: i32) -> io::Result<()> {
self.set_dictionary(level, &[])
}
pub fn set_dictionary(
&mut self,
level: i32,
dictionary: &[u8],
) -> io::Result<()> {
self.context
.set_parameter(zstd_safe::CParameter::CompressionLevel(level))
.map_err(map_error_code)?;
self.context
.load_dictionary(dictionary)
.map_err(map_error_code)?;
Ok(())
}
pub fn set_prepared_dictionary<'b>(
&mut self,
dictionary: &'a crate::dict::EncoderDictionary<'b>,
) -> io::Result<()>
where
'b: 'a,
{
self.context
.ref_cdict(dictionary.as_cdict())
.map_err(map_error_code)?;
Ok(())
}
pub fn compress_to_buffer<C: zstd_safe::WriteBuf + ?Sized>(
&mut self,
source: &[u8],
destination: &mut C,
) -> io::Result<usize> {
self.context
.compress2(destination, source)
.map_err(map_error_code)
}
pub fn compress(&mut self, data: &[u8]) -> io::Result<Vec<u8>> {
let buffer_len = zstd_safe::compress_bound(data.len());
let mut buffer = Vec::with_capacity(buffer_len);
self.compress_to_buffer(data, &mut buffer)?;
Ok(buffer)
}
pub fn context_mut(&mut self) -> &mut zstd_safe::CCtx<'a> {
&mut self.context
}
pub fn set_parameter(
&mut self,
parameter: zstd_safe::CParameter,
) -> io::Result<()> {
self.context
.set_parameter(parameter)
.map_err(map_error_code)?;
Ok(())
}
crate::encoder_parameters!();
}
fn _assert_traits() {
fn _assert_send<T: Send>(_: T) {}
_assert_send(Compressor::new(0));
}