use std::io::Read;
use serde::de::DeserializeOwned;
pub fn decode_gz_json<T: DeserializeOwned>(bytes: &[u8], what: &str) -> T {
let mut json = String::new();
flate2::read::GzDecoder::new(bytes)
.read_to_string(&mut json)
.unwrap_or_else(|e| panic!("embedded {what} is not valid gzip: {e}"));
serde_json::from_str(&json).unwrap_or_else(|e| panic!("embedded {what} is not valid JSON: {e}"))
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Write;
fn gz(data: &[u8]) -> Vec<u8> {
let mut enc = flate2::write::GzEncoder::new(Vec::new(), flate2::Compression::default());
enc.write_all(data).unwrap();
enc.finish().unwrap()
}
#[test]
fn decodes_gzipped_json() {
let v: Vec<u32> = decode_gz_json(&gz(b"[1,2,3]"), "test data");
assert_eq!(v, [1, 2, 3]);
}
#[test]
#[should_panic(expected = "embedded test data is not valid gzip")]
fn rejects_non_gzip() {
let _: Vec<u32> = decode_gz_json(b"[1]", "test data");
}
#[test]
#[should_panic(expected = "embedded test data is not valid JSON")]
fn rejects_bad_json() {
let _: Vec<u32> = decode_gz_json(&gz(b"[1,"), "test data");
}
}