niffler_temp/send/
compression.rs1#![allow(clippy::unnecessary_wraps)]
2
3use std::io;
5
6use cfg_if::cfg_if;
8
9use crate::error::Error;
11use crate::level::Level;
12
13#[derive(Debug, PartialEq, Eq, Clone, Copy)]
16pub enum Format {
17 Gzip,
18 Bzip,
19 Lzma,
20 Zstd,
21 No,
22}
23
24impl Format {
25 #[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}