niffler_temp/basic/
compression.rs1#![allow(clippy::unnecessary_wraps)]
2
3use std::io;
5
6use cfg_if::cfg_if;
8
9use crate::error::Error;
11
12pub use crate::level::Level;
14
15#[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}