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