rill_server/actors/router/
assets.rs1use crate::meta;
2use anyhow::Error;
3use flate2::read::GzDecoder;
4use reqwest::Url;
5use std::collections::HashMap;
6use std::io::Read;
7use std::sync::Arc;
8use tar::Archive;
9use thiserror::Error;
10
11#[derive(Debug, Error)]
12enum Reason {
13 #[error("wrong format")]
14 WrongFormat,
15}
16
17#[derive(Clone, Debug)]
18pub struct Assets {
19 files: Arc<HashMap<String, Vec<u8>>>,
20}
21
22impl Assets {
23 pub fn url() -> Url {
24 format!(
25 "https://ui.rillrate.com/view/release/{version}.tar.gz",
26 version = meta::VERSION,
27 )
28 .parse()
29 .unwrap()
30 }
31
32 pub fn parse(assets: &[u8]) -> Result<Assets, Error> {
34 let tar = GzDecoder::new(assets);
35 let mut archive = Archive::new(tar);
36 let mut files = HashMap::new();
37 for entry in archive.entries()? {
38 let mut entry = entry?;
39 let mut data = Vec::new();
40 entry.read_to_end(&mut data)?;
41 if !data.is_empty() {
42 let name = entry
43 .path()?
44 .to_str()
45 .ok_or(Reason::WrongFormat)?
46 .to_owned();
47 #[cfg(debug_assertions)]
48 log::trace!("Register asset file: {}", name);
49 files.insert(name, data);
50 }
51 }
52 Ok(Self {
53 files: Arc::new(files),
54 })
55 }
56
57 pub fn get(&self, path: &str) -> Option<&[u8]> {
58 self.files.get(path).map(Vec::as_ref)
59 }
60}