diff options
author | metamuffin <metamuffin@disroot.org> | 2023-06-24 23:50:22 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-06-24 23:50:22 +0200 |
commit | b408b2ebcafddde5a93a3f708d815fcf740607fb (patch) | |
tree | 562ff7b45aa973ef91f7d9ba22f3c4e8dc957363 /server/src | |
parent | bdbb7c8b092e2e59d36ad7e979fbe9ac0a2fcff1 (diff) | |
download | keks-meet-b408b2ebcafddde5a93a3f708d815fcf740607fb.tar keks-meet-b408b2ebcafddde5a93a3f708d815fcf740607fb.tar.bz2 keks-meet-b408b2ebcafddde5a93a3f708d815fcf740607fb.tar.zst |
embed sass without debug_assertions
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/assets.rs | 69 | ||||
-rw-r--r-- | server/src/main.rs | 5 |
2 files changed, 64 insertions, 10 deletions
diff --git a/server/src/assets.rs b/server/src/assets.rs index 6047164..d6e94a2 100644 --- a/server/src/assets.rs +++ b/server/src/assets.rs @@ -1,7 +1,5 @@ -use std::fs::read_to_string; - -use grass::StdFs; use log::error; +use std::sync::LazyLock; #[cfg(debug_assertions)] #[macro_export] @@ -55,13 +53,68 @@ macro_rules! s_asset_dir { }}; } -pub fn css_bundle() -> String { - grass::from_string( - read_to_string("../client-web/style/master.sass").unwrap(), +#[derive(Debug)] +struct GrassFs; +#[cfg(debug_assertions)] +impl GrassFs { + pub fn map(p: &std::path::Path) -> std::path::PathBuf { + std::path::PathBuf::try_from("../client-web/style") + .unwrap() + .join(p.file_name().unwrap()) + } +} +#[cfg(debug_assertions)] +impl grass::Fs for GrassFs { + fn is_dir(&self, path: &std::path::Path) -> bool { + Self::map(path).is_dir() + } + fn is_file(&self, path: &std::path::Path) -> bool { + Self::map(path).is_file() + } + fn read(&self, path: &std::path::Path) -> std::io::Result<Vec<u8>> { + std::fs::read(Self::map(path)) + } +} + +#[cfg(not(debug_assertions))] +const STYLE_DIR: include_dir::Dir = + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../client-web/style"); +#[cfg(not(debug_assertions))] +impl grass::Fs for GrassFs { + fn is_dir(&self, _path: &std::path::Path) -> bool { + false + } + fn is_file(&self, path: &std::path::Path) -> bool { + STYLE_DIR.get_file(path.file_name().unwrap()).is_some() + } + fn read(&self, path: &std::path::Path) -> std::io::Result<Vec<u8>> { + Ok(STYLE_DIR + .get_file(path.file_name().unwrap()) + .ok_or(std::io::Error::new( + std::io::ErrorKind::NotFound, + "not found", + ))? + .contents() + .to_vec()) + } +} + +static CSS_BUNDLE: LazyLock<String> = LazyLock::new(css_bundle); + +pub fn css() -> String { + if cfg!(debug_assertions) { + css_bundle() + } else { + CSS_BUNDLE.clone() + } +} +fn css_bundle() -> String { + grass::from_path( + "/master.sass", &grass::Options::default() .input_syntax(grass::InputSyntax::Sass) - .load_path("../client-web/style") - .fs(&StdFs), + .load_path("/") + .fs(&GrassFs), ) .unwrap_or_else(|err| { error!("sass compile failed: {err}"); diff --git a/server/src/main.rs b/server/src/main.rs index 431d668..57ec4df 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -3,12 +3,13 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2022 metamuffin <metamuffin@disroot.org> */ +#![feature(lazy_cell)] pub mod assets; pub mod config; pub mod protocol; pub mod room; -use assets::css_bundle; +use assets::css; use config::{ClientAppearanceConfig, ClientConfig}; use hyper::{header, StatusCode}; use listenfd::ListenFd; @@ -70,7 +71,7 @@ async fn run() { warp::reply::with_header(client_config_css.clone(), "content-type", "text/css") }); let css: _ = warp::path!("style.css") - .map(move || warp::reply::with_header(css_bundle(), "content-type", "text/css")); + .map(move || warp::reply::with_header(css(), "content-type", "text/css")); let favicon: _ = warp::path!("favicon.ico").map(|| ""); let old_format_redirect: _ = warp::path!("room" / String).map(|rsecret| { reply::with_header( |