kutil_transcoding/
bytes.rs

1use super::encoding::*;
2
3use {
4    async_compression::tokio::{bufread, write},
5    bytes::*,
6    std::io,
7    tokio::io::*,
8};
9
10//
11// TranscodeToBytes
12//
13
14/// Transcode to [Bytes].
15#[allow(async_fn_in_trait)]
16pub trait TranscodeToBytes {
17    /// Encode to [Bytes].
18    async fn encode(&self, encoding: &Encoding) -> io::Result<Bytes>;
19
20    /// Decode to [Bytes].
21    async fn decode(&self, encoding: &Encoding) -> io::Result<Bytes>;
22}
23
24impl TranscodeToBytes for Bytes {
25    async fn encode(&self, encoding: &Encoding) -> io::Result<Bytes> {
26        match encoding {
27            Encoding::Identity => Ok(self.clone()),
28
29            Encoding::Brotli => {
30                let mut encoder = write::BrotliEncoder::new(Vec::new());
31                encoder.write_all(self).await?;
32                encoder.shutdown().await?;
33                Ok(encoder.into_inner().into())
34            }
35
36            Encoding::Deflate => {
37                let mut encoder = write::DeflateEncoder::new(Vec::new());
38                encoder.write_all(self).await?;
39                encoder.shutdown().await?;
40                Ok(encoder.into_inner().into())
41            }
42
43            Encoding::GZip => {
44                let mut encoder = write::GzipEncoder::new(Vec::new());
45                encoder.write_all(self).await?;
46                encoder.shutdown().await?;
47                Ok(encoder.into_inner().into())
48            }
49
50            Encoding::Zstandard => {
51                let mut encoder = write::ZstdEncoder::new(Vec::new());
52                encoder.write_all(self).await?;
53                encoder.shutdown().await?;
54                Ok(encoder.into_inner().into())
55            }
56        }
57    }
58
59    async fn decode(&self, encoding: &Encoding) -> io::Result<Bytes> {
60        match encoding {
61            Encoding::Identity => Ok(self.clone()),
62
63            Encoding::Brotli => {
64                let mut decoder = bufread::BrotliDecoder::new(BufReader::new(self.as_ref()));
65                let mut buffer = Vec::new();
66                decoder.read_to_end(&mut buffer).await?;
67                Ok(buffer.into())
68            }
69
70            Encoding::Deflate => {
71                let mut decoder = bufread::DeflateDecoder::new(BufReader::new(self.as_ref()));
72                let mut buffer = Vec::new();
73                decoder.read_to_end(&mut buffer).await?;
74                Ok(buffer.into())
75            }
76
77            Encoding::GZip => {
78                let mut decoder = bufread::GzipDecoder::new(BufReader::new(self.as_ref()));
79                let mut buffer = Vec::new();
80                decoder.read_to_end(&mut buffer).await?;
81                Ok(buffer.into())
82            }
83
84            Encoding::Zstandard => {
85                let mut decoder = bufread::ZstdDecoder::new(BufReader::new(self.as_ref()));
86                let mut buffer = Vec::new();
87                decoder.read_to_end(&mut buffer).await?;
88                Ok(buffer.into())
89            }
90        }
91    }
92}