1use std::io::Read;
2
3pub enum Decompressor {
4 None,
5 Gzip,
6 Deflate,
7}
8
9impl Decompressor {
10 pub fn new(encoding: Option<&str>) -> Self {
11 match encoding {
12 Some("gzip") | Some("x-gzip") => Decompressor::Gzip,
13 Some("deflate") => Decompressor::Deflate,
14 _ => Decompressor::None,
15 }
16 }
17
18 pub fn decompress(&self, input: &[u8]) -> Result<Vec<u8>, String> {
19 match self {
20 Decompressor::None => Ok(input.to_vec()),
21 Decompressor::Gzip => {
22 let mut decoder = flate2::read::GzDecoder::new(input);
23 let mut out = Vec::new();
24 decoder
25 .read_to_end(&mut out)
26 .map_err(|e| format!("gzip error: {e}"))?;
27 Ok(out)
28 }
29 Decompressor::Deflate => {
30 let mut decoder = flate2::read::ZlibDecoder::new(input);
31 let mut out = Vec::new();
32 decoder
33 .read_to_end(&mut out)
34 .map_err(|e| format!("deflate error: {e}"))?;
35 Ok(out)
36 }
37 }
38 }
39}