Skip to main content

martin_tile_utils/
decoders.rs

1use std::io::Read as _;
2
3use flate2::read::{GzEncoder, MultiGzDecoder, ZlibDecoder, ZlibEncoder};
4
5pub fn decode_gzip(data: &[u8]) -> Result<Vec<u8>, std::io::Error> {
6    let mut decoder = hotpath::io!(MultiGzDecoder::new(data), label = "decode_gzip");
7    let mut decompressed = Vec::new();
8    decoder.read_to_end(&mut decompressed)?;
9    Ok(decompressed)
10}
11
12pub fn encode_zlib(data: &[u8]) -> Result<Vec<u8>, std::io::Error> {
13    let mut encoder = hotpath::io!(
14        ZlibEncoder::new(data, flate2::Compression::default()),
15        label = "encode_zlib"
16    );
17    let mut compressed = Vec::new();
18    encoder.read_to_end(&mut compressed)?;
19    Ok(compressed)
20}
21
22pub fn decode_zlib(data: &[u8]) -> Result<Vec<u8>, std::io::Error> {
23    let mut decoder = hotpath::io!(ZlibDecoder::new(data), label = "decode_zlib");
24    let mut decompressed = Vec::new();
25    decoder.read_to_end(&mut decompressed)?;
26    Ok(decompressed)
27}
28
29pub fn encode_gzip(data: &[u8]) -> Result<Vec<u8>, std::io::Error> {
30    let mut encoder = hotpath::io!(
31        GzEncoder::new(data, flate2::Compression::default()),
32        label = "encode_gzip"
33    );
34    let mut compressed = Vec::new();
35    encoder.read_to_end(&mut compressed)?;
36    Ok(compressed)
37}
38
39pub fn decode_brotli(data: &[u8]) -> Result<Vec<u8>, std::io::Error> {
40    let mut decoder = hotpath::io!(
41        brotli::Decompressor::new(data, 4096),
42        label = "decode_brotli"
43    );
44    let mut decompressed = Vec::new();
45    decoder.read_to_end(&mut decompressed)?;
46    Ok(decompressed)
47}
48
49pub fn encode_brotli(data: &[u8]) -> Result<Vec<u8>, std::io::Error> {
50    let mut encoder = hotpath::io!(
51        brotli::CompressorReader::new(data, 4096, 11, 22),
52        label = "encode_brotli"
53    );
54    let mut compressed = Vec::new();
55    encoder.read_to_end(&mut compressed)?;
56    Ok(compressed)
57}
58
59/// Encodes with the given Brotli quality, clamped to the valid `0..=11` range.
60pub fn encode_brotli_with_quality(data: &[u8], quality: u32) -> Result<Vec<u8>, std::io::Error> {
61    let mut encoder = hotpath::io!(
62        brotli::CompressorReader::new(data, 4096, quality.min(11), 22),
63        label = "encode_brotli_with_quality"
64    );
65    let mut compressed = Vec::new();
66    encoder.read_to_end(&mut compressed)?;
67    Ok(compressed)
68}
69
70pub fn decode_zstd(data: &[u8]) -> Result<Vec<u8>, std::io::Error> {
71    let mut decoder = hotpath::io!(zstd::Decoder::new(data)?, label = "decode_zstd");
72    let mut decompressed = Vec::new();
73    decoder.read_to_end(&mut decompressed)?;
74    Ok(decompressed)
75}
76
77pub fn encode_zstd(data: &[u8]) -> Result<Vec<u8>, std::io::Error> {
78    let mut encoder = hotpath::io!(
79        zstd::stream::read::Encoder::new(data, 0)?,
80        label = "encode_zstd"
81    );
82    let mut compressed = Vec::new();
83    encoder.read_to_end(&mut compressed)?;
84    Ok(compressed)
85}