rill_server/actors/router/
assets.rs

1use 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    /// Expected gzipped tar file contents.
33    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}