blob: 8965b65184d2a17d983e264565285a10f2461a35 [file] [log] [blame]
macro_rules! algos {
(@algo $algo:ident [$algo_s:expr] $decoder:ident $encoder:ident <$inner:ident>
{ @enc $($encoder_methods:tt)* }
{ @dec $($decoder_methods:tt)* }
) => {
#[cfg(feature = $algo_s)]
decoder! {
#[doc = concat!("A ", $algo_s, " decoder, or decompressor")]
#[cfg(feature = $algo_s)]
$decoder<$inner>
{ $($decoder_methods)* }
}
#[cfg(feature = $algo_s)]
encoder! {
#[doc = concat!("A ", $algo_s, " encoder, or compressor.")]
#[cfg(feature = $algo_s)]
$encoder<$inner> {
pub fn new(inner: $inner) -> Self {
Self::with_quality(inner, crate::Level::Default)
}
}
{ $($encoder_methods)* }
}
};
(@algo $algo:ident [$algo_s:expr] $decoder:ident $encoder:ident <$inner:ident>
{ @dec $($decoder_methods:tt)* }
) => {
#[cfg(feature = $algo_s)]
decoder! {
#[doc = concat!("A ", $algo_s, " decoder, or decompressor")]
#[cfg(feature = $algo_s)]
$decoder<$inner>
{ $($decoder_methods)* }
}
};
($($mod:ident)::+ <$inner:ident>) => {
algos!(@algo brotli ["brotli"] BrotliDecoder BrotliEncoder <$inner>
{ @enc
pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
let params = brotli::enc::backward_references::BrotliEncoderParams::default();
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::BrotliEncoder::new(level.into_brotli(params)),
),
}
}
/// Creates a new encoder, using the specified compression level and parameters, which
/// will read uncompressed data from the given stream and emit a compressed stream.
pub fn with_quality_and_params(
inner: $inner,
level: crate::Level,
params: crate::brotli::EncoderParams,
) -> Self {
let params = level.into_brotli(params.as_brotli());
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::BrotliEncoder::new(params),
),
}
}
}
{ @dec }
);
algos!(@algo bzip2 ["bzip2"] BzDecoder BzEncoder <$inner>
{ @enc
pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::BzEncoder::new(level.into_bzip2(), 0),
),
}
}
}
{ @dec }
);
algos!(@algo deflate ["deflate"] DeflateDecoder DeflateEncoder <$inner>
{ @enc
pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::DeflateEncoder::new(level.into_flate2()),
),
}
}
}
{ @dec }
);
algos!(@algo deflate ["deflate64"] Deflate64Decoder Deflate64Encoder <$inner>
{ @dec }
);
algos!(@algo gzip ["gzip"] GzipDecoder GzipEncoder <$inner>
{ @enc
pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::GzipEncoder::new(level.into_flate2()),
),
}
}
}
{ @dec }
);
algos!(@algo zlib ["zlib"] ZlibDecoder ZlibEncoder <$inner>
{ @enc
pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::ZlibEncoder::new(level.into_flate2()),
),
}
}
}
{ @dec }
);
algos!(@algo zstd ["zstd"] ZstdDecoder ZstdEncoder <$inner>
{ @enc
pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::ZstdEncoder::new(level.into_zstd()),
),
}
}
/// Creates a new encoder, using the specified compression level and parameters, which
/// will read uncompressed data from the given stream and emit a compressed stream.
///
/// # Panics
///
/// Panics if this function is called with a [`CParameter::nb_workers()`] parameter and
/// the `zstdmt` crate feature is _not_ enabled.
///
/// [`CParameter::nb_workers()`]: crate::zstd::CParameter
//
// TODO: remove panic note on next breaking release, along with `CParameter::nb_workers`
// change
pub fn with_quality_and_params(inner: $inner, level: crate::Level, params: &[crate::zstd::CParameter]) -> Self {
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::ZstdEncoder::new_with_params(level.into_zstd(), params),
),
}
}
/// Creates a new encoder, using the specified compression level and pre-trained
/// dictionary, which will read uncompressed data from the given stream and emit a
/// compressed stream.
///
/// Dictionaries provide better compression ratios for small files, but are required to
/// be present during decompression.
///
/// # Errors
///
/// Returns error when `dictionary` is not valid.
pub fn with_dict(inner: $inner, level: crate::Level, dictionary: &[u8]) -> ::std::io::Result<Self> {
Ok(Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::ZstdEncoder::new_with_dict(level.into_zstd(), dictionary)?,
),
})
}
}
{ @dec
/// Creates a new decoder, using the specified compression level and pre-trained
/// dictionary, which will read compressed data from the given stream and emit an
/// uncompressed stream.
///
/// Dictionaries provide better compression ratios for small files, but are required to
/// be present during decompression. The dictionary used must be the same as the one
/// used for compression.
///
/// # Errors
///
/// Returns error when `dictionary` is not valid.
pub fn with_dict(inner: $inner, dictionary: &[u8]) -> ::std::io::Result<Self> {
Ok(Self {
inner: crate::$($mod::)+generic::Decoder::new(
inner,
crate::codec::ZstdDecoder::new_with_dict(dictionary)?,
),
})
}
}
);
algos!(@algo xz ["xz"] XzDecoder XzEncoder <$inner>
{ @enc
pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::XzEncoder::new(level.into_xz2()),
),
}
}
}
{ @dec
/// Creates a new decoder with the specified limit of memory.
///
/// # Errors
///
/// An IO error may be returned during decoding if the specified limit is too small.
pub fn with_mem_limit(read: $inner, memlimit: u64) -> Self {
Self {
inner: crate::$($mod::)+generic::Decoder::new(
read,
crate::codec::XzDecoder::with_memlimit(memlimit),
),
}
}
}
);
algos!(@algo lzma ["lzma"] LzmaDecoder LzmaEncoder <$inner>
{ @enc
pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
Self {
inner: crate::$($mod::)+generic::Encoder::new(
inner,
crate::codec::LzmaEncoder::new(level.into_xz2()),
),
}
}
}
{ @dec
/// Creates a new decoder with the specified limit of memory.
///
/// # Errors
///
/// An IO error may be returned during decoding if the specified limit is too small.
pub fn with_mem_limit(read: $inner, memlimit: u64) -> Self {
Self {
inner: crate::$($mod::)+generic::Decoder::new(
read,
crate::codec::LzmaDecoder::with_memlimit(memlimit),
),
}
}
}
);
}
}