embed_resources/structs/
resource.rs1use 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), Url(String), Data(Bytes), }
14
15impl Resource {
16 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 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}