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
11pub 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 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 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}