niffler_temp/send/
compression.rs

1#![allow(clippy::unnecessary_wraps)]
2
3/* standard use */
4use std::io;
5
6/* crates use */
7use cfg_if::cfg_if;
8
9/* project use */
10use crate::error::Error;
11use crate::level::Level;
12
13/* Format detection enum */
14/// `Format` represent a compression format of a file. Currently Gzip, Bzip, Lzma or No are supported.
15#[derive(Debug, PartialEq, Eq, Clone, Copy)]
16pub enum Format {
17    Gzip,
18    Bzip,
19    Lzma,
20    Zstd,
21    No,
22}
23
24impl Format {
25    /// An alias for Lzma, Format::Lzma == Format::Xz
26    #[allow(non_upper_case_globals)]
27    pub const Xz: Format = Format::Lzma;
28}
29
30pub(crate) fn bytes2type(bytes: [u8; 5]) -> Format {
31    match bytes {
32        [0x1f, 0x8b, ..] => Format::Gzip,
33        [0x42, 0x5a, ..] => Format::Bzip,
34        [0xfd, 0x37, 0x7a, 0x58, 0x5a] => Format::Lzma,
35        [0x28, 0xb5, 0x2f, 0xfd, ..] => Format::Zstd,
36        _ => Format::No,
37    }
38}
39
40cfg_if! {
41    if #[cfg(feature = "gz")] {
42        pub(crate) fn new_gz_encoder<'a>(out: Box<dyn io::Write + Send + 'a>, level: Level) -> Result<Box<dyn io::Write + Send + 'a>, Error> {
43            Ok(Box::new(flate2::write::GzEncoder::new(
44        out,
45        level.into(),
46            )))
47        }
48
49        pub(crate) fn new_gz_decoder<'a>(
50            inp: Box<dyn io::Read + Send + 'a>,
51        ) -> Result<(Box<dyn io::Read + Send + 'a>, Format), Error> {
52            Ok((
53        Box::new(flate2::read::MultiGzDecoder::new(inp)),
54        Format::Gzip,
55            ))
56        }
57    } else {
58        pub(crate) fn new_gz_encoder<'a>(_: Box<dyn io::Write + Send + 'a>, _: Level) -> Result<Box<dyn io::Write + Send + 'a>, Error> {
59            Err(Error::FeatureDisabled)
60        }
61
62        pub(crate) fn new_gz_decoder<'a>(_: Box<dyn io::Read + Send + 'a>) -> Result<(Box<dyn io::Read + Send + 'a>, Format), Error> {
63            Err(Error::FeatureDisabled)
64        }
65    }
66}
67
68cfg_if! {
69    if #[cfg(feature = "bz2")] {
70        pub(crate) fn new_bz2_encoder<'a>(out: Box<dyn io::Write + Send + 'a>, level: Level) -> Result<Box<dyn io::Write + Send + 'a>, Error> {
71            Ok(Box::new(bzip2::write::BzEncoder::new(
72                out,
73                level.into(),
74            )))
75        }
76
77        pub(crate) fn new_bz2_decoder<'a>(
78            inp: Box<dyn io::Read + Send + 'a>,
79        ) -> Result<(Box<dyn io::Read + Send + 'a>, Format), Error> {
80            Ok((
81                Box::new(bzip2::read::BzDecoder::new(inp)),
82                Format::Bzip,
83            ))
84        }
85    } else {
86        pub(crate) fn new_bz2_encoder<'a>(_: Box<dyn io::Write + Send + 'a>, _: Level) -> Result<Box<dyn io::Write + Send + 'a>, Error> {
87            Err(Error::FeatureDisabled)
88        }
89
90        pub(crate) fn new_bz2_decoder<'a>(_: Box<dyn io::Read + Send + 'a>) -> Result<(Box<dyn io::Read + Send + 'a>, Format), Error> {
91            Err(Error::FeatureDisabled)
92        }
93    }
94}
95
96cfg_if! {
97    if #[cfg(feature = "lzma")] {
98    pub(crate) fn new_lzma_encoder<'a>(out: Box<dyn io::Write + Send + 'a>, level: Level) -> Result<Box<dyn io::Write + Send + 'a>, Error> {
99            Ok(Box::new(liblzma::write::XzEncoder::new(out, level.into())))
100    }
101
102    pub(crate) fn new_lzma_decoder<'a>(
103            inp: Box<dyn io::Read + Send + 'a>,
104    ) -> Result<(Box<dyn io::Read + Send + 'a>, Format), Error> {
105            Ok((
106        Box::new(liblzma::read::XzDecoder::new(inp)),
107        Format::Lzma,
108            ))
109    }
110    } else {
111    pub(crate) fn new_lzma_encoder<'a>(_: Box<dyn io::Write + Send + 'a>, _: Level) -> Result<Box<dyn io::Write + Send + 'a>, Error> {
112            Err(Error::FeatureDisabled)
113    }
114
115    pub(crate) fn new_lzma_decoder<'a>(_: Box<dyn io::Read + Send + 'a>) -> Result<(Box<dyn io::Read + Send + 'a>, Format), Error> {
116            Err(Error::FeatureDisabled)
117    }
118    }
119}
120
121cfg_if! {
122    if #[cfg(feature = "zstd")] {
123        pub(crate) fn new_zstd_encoder<'a>(out: Box<dyn io::Write + Send + 'a>, level: Level) -> Result<Box<dyn io::Write +Send + 'a>, Error> {
124            Ok(Box::new(zstd::stream::write::Encoder::new(
125                        out,
126                        level.into(),
127            )?.auto_finish()))
128        }
129
130        pub(crate) fn new_zstd_decoder<'a>(
131            inp: Box<dyn io::Read +Send + 'a>,
132        ) -> Result<(Box<dyn io::Read + Send + 'a>, Format), Error> {
133            Ok((Box::new(zstd::stream::read::Decoder::new(inp)?),
134                         Format::Zstd,
135            ))
136        }
137    } else {
138        pub(crate) fn new_zstd_encoder<'a>(_: Box<dyn io::Write +Send + 'a>, _: Level) -> Result<Box<dyn io::Write+Send  + 'a>, Error> {
139            Err(Error::FeatureDisabled)
140        }
141
142        pub(crate) fn new_zstd_decoder<'a>(_: Box<dyn io::Read +Send + 'a>) -> Result<(Box<dyn io::Read+Send  + 'a>, Format), Error> {
143            Err(Error::FeatureDisabled)
144        }
145    }
146}