embed_resources/structs/
resource.rs

1use bytes::Bytes;
2use flate2::write::GzEncoder;
3use flate2::Compression;
4use reqwest;
5use std::fs::File;
6use std::io::{self, Read, Write};
7
8#[derive(Debug)]
9pub enum Resource {
10    File(String), // Path to a file
11    Url(String),  // URL as a string
12    Data(Bytes),  // Arbitrary in-memory data
13}
14
15impl Resource {
16    /// Fetches and optionally compresses the resource into a `Bytes` object.
17    pub fn fetch(&self, compress: bool) -> io::Result<Bytes> {
18        match self {
19            Resource::File(path) => {
20                let mut file = File::open(path)?;
21                let mut buffer = Vec::new();
22                file.read_to_end(&mut buffer)?;
23
24                if compress {
25                    Ok(Self::compress_data(buffer)?)
26                } else {
27                    Ok(Bytes::from(buffer))
28                }
29            }
30            Resource::Url(url) => {
31                let response = reqwest::blocking::get(url)
32                    .map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?
33                    .bytes()
34                    .map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?;
35
36                if compress {
37                    Ok(Self::compress_data(response.to_vec())?)
38                } else {
39                    Ok(Bytes::from(response))
40                }
41            }
42            Resource::Data(data) => {
43                if compress {
44                    Ok(Self::compress_data(data.to_vec())?)
45                } else {
46                    Ok(data.clone())
47                }
48            }
49        }
50    }
51
52    /// Compresses data using GzEncoding.
53    fn compress_data(data: Vec<u8>) -> io::Result<Bytes> {
54        let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
55        encoder.write_all(&data)?;
56        let compressed_data = encoder.finish()?;
57        Ok(Bytes::from(compressed_data))
58    }
59}