memory_serve_core/
lib.rs

1mod asset;
2mod code;
3mod list;
4mod util;
5
6use std::path::PathBuf;
7
8pub use asset::Asset;
9pub use code::assets_to_code;
10
11/// File mime types that can possibly be compressed
12pub const COMPRESS_TYPES: &[&str] = &[
13    "text/html",
14    "text/css",
15    "application/json",
16    "text/javascript",
17    "application/javascript",
18    "application/xml",
19    "text/xml",
20    "image/svg+xml",
21    "application/wasm",
22];
23
24pub const ENV_NAME: &str = "ASSET_DIR";
25pub const ASSET_FILE: &str = "memory_serve_assets.rs";
26pub const QUIET_ENV_NAME: &str = "MEMORY_SERVE_QUIET";
27pub const ROOT_ENV_NAME: &str = "MEMORY_SERVE_ROOT";
28pub const FORCE_EMBED_FEATURE: &str = "CARGO_FEATURE_FORCE_EMBED";
29
30pub fn load_directory<P: Into<PathBuf>>(path: P) {
31    // determine whether to dynamically load assets or embed them in the binary
32    let force_embed = std::env::var(FORCE_EMBED_FEATURE).unwrap_or_default();
33    println!("cargo::rerun-if-env-changed={FORCE_EMBED_FEATURE}");
34    let embed = !cfg!(debug_assertions) || force_embed == "1";
35
36    load_directory_with_embed(path, embed);
37}
38
39pub fn load_directory_with_embed<P: Into<PathBuf>>(path: P, embed: bool) {
40    load_names_directories(vec![(ENV_NAME, path)], embed);
41}
42
43pub fn load_names_directories<N, P>(named_paths: impl IntoIterator<Item = (N, P)>, embed: bool)
44where
45    N: Into<String>,
46    P: Into<PathBuf>,
47{
48    let out_dir: String = std::env::var("OUT_DIR").expect("OUT_DIR environment variable not set.");
49    let out_dir = PathBuf::from(&out_dir);
50
51    fn log(msg: &str) {
52        if std::env::var(QUIET_ENV_NAME) != Ok("1".to_string()) {
53            println!("cargo:warning={}", msg);
54        }
55    }
56
57    // using a string is faster than using quote ;)
58    let mut code = "&[".to_string();
59
60    for (name, asset_dir) in named_paths {
61        let asset_dir = asset_dir
62            .into()
63            .canonicalize()
64            .expect("Could not canonicalize the provided path");
65        let asset_dir_label = asset_dir.to_string_lossy();
66        let assets = assets_to_code(
67            &asset_dir_label,
68            &asset_dir,
69            Some(out_dir.as_path()),
70            embed,
71            log,
72        );
73
74        println!("cargo::rerun-if-changed={asset_dir_label}");
75
76        code = format!("{code}(\"{}\", {assets}),", name.into());
77    }
78
79    code.push(']');
80
81    println!("cargo::rerun-if-env-changed={QUIET_ENV_NAME}");
82
83    let target = out_dir.join(ASSET_FILE);
84
85    std::fs::write(target, code).expect("Unable to write memory-serve asset file.");
86}