Skip to main content

sofie_engine/asset/
precompressed.rs

1use super::Asset;
2
3#[derive(Clone, Copy, Debug)]
4pub struct Precompressed {
5    pub brotli: &'static [u8],
6    pub gzip: &'static [u8],
7}
8
9impl Asset {
10    #[must_use]
11    pub const fn with_precompressed(mut self, precompressed: Precompressed) -> Self {
12        self.precompressed = Some(precompressed);
13        self
14    }
15
16    #[must_use]
17    pub const fn precompressed(&self) -> Option<Precompressed> {
18        self.precompressed
19    }
20}
21
22#[cfg(test)]
23mod tests {
24    use std::io::Read;
25
26    use crate::{CLIENT_SCRIPT, ENGINE_SCRIPT, STYLESHEET};
27
28    #[test]
29    fn each_engine_asset_decompresses_to_its_own_bytes() {
30        for asset in [CLIENT_SCRIPT, ENGINE_SCRIPT, STYLESHEET] {
31            let precompressed = asset.precompressed().unwrap();
32            let mut from_brotli = Vec::new();
33            brotli::Decompressor::new(precompressed.brotli, 4096)
34                .read_to_end(&mut from_brotli)
35                .unwrap();
36            let mut from_gzip = Vec::new();
37            flate2::read::GzDecoder::new(precompressed.gzip)
38                .read_to_end(&mut from_gzip)
39                .unwrap();
40
41            assert_eq!(from_brotli, asset.bytes);
42            assert_eq!(from_gzip, asset.bytes);
43            assert!(precompressed.brotli.len() < asset.bytes.len() / 2);
44        }
45    }
46}