1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use {crate::error::Result, std::io::Read};
pub mod builder;
pub mod reader;
pub enum DebCompression {
Uncompressed,
Gzip,
Xz(u32),
Zstandard(i32),
}
impl DebCompression {
pub fn extension(&self) -> &'static str {
match self {
Self::Uncompressed => "",
Self::Gzip => ".gz",
Self::Xz(_) => ".xz",
Self::Zstandard(_) => ".zst",
}
}
pub fn compress(&self, reader: &mut impl Read) -> Result<Vec<u8>> {
let mut buffer = vec![];
match self {
Self::Uncompressed => {
std::io::copy(reader, &mut buffer)?;
}
Self::Gzip => {
let header = libflate::gzip::HeaderBuilder::new().finish();
let mut encoder = libflate::gzip::Encoder::with_options(
&mut buffer,
libflate::gzip::EncodeOptions::new().header(header),
)?;
std::io::copy(reader, &mut encoder)?;
encoder.finish().into_result()?;
}
Self::Xz(level) => {
let mut encoder = xz2::write::XzEncoder::new(buffer, *level);
std::io::copy(reader, &mut encoder)?;
buffer = encoder.finish()?;
}
Self::Zstandard(level) => {
let mut encoder = zstd::Encoder::new(buffer, *level)?;
std::io::copy(reader, &mut encoder)?;
buffer = encoder.finish()?;
}
}
Ok(buffer)
}
}