kutil_transcoding/
bytes.rs1use super::encoding::*;
2
3use {
4 async_compression::tokio::{bufread, write},
5 bytes::*,
6 std::io,
7 tokio::io::*,
8};
9
10#[allow(async_fn_in_trait)]
16pub trait TranscodeToBytes {
17 async fn encode(&self, encoding: &Encoding) -> io::Result<Bytes>;
19
20 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}