memory_serve_macros/
lib.rs

1use memory_serve_core::{QUIET_ENV_NAME, ROOT_ENV_NAME, assets_to_code};
2use proc_macro::TokenStream;
3use std::{env, path::Path};
4
5#[proc_macro]
6pub fn load_assets(input: TokenStream) -> TokenStream {
7    let input = input.to_string();
8    let asset_dir = input.trim_matches('"');
9    let mut path = Path::new(&asset_dir).to_path_buf();
10
11    fn log(msg: &str) {
12        if std::env::var(QUIET_ENV_NAME) != Ok("1".to_string()) {
13            println!("  memory_serve: {msg}");
14        }
15    }
16
17    if path.is_relative() {
18        if let Ok(root_dir) = env::var(ROOT_ENV_NAME) {
19            path = Path::new(&root_dir).join(path);
20        } else if let Ok(crate_dir) = env::var("CARGO_MANIFEST_DIR") {
21            path = Path::new(&crate_dir).join(path);
22        } else {
23            panic!("Relative path provided but CARGO_MANIFEST_DIR environment variable not set");
24        }
25    }
26
27    path = path
28        .canonicalize()
29        .expect("Could not canonicalize the provided path");
30
31    if !path.exists() {
32        panic!("The path {path:?} does not exists!");
33    }
34
35    let embed = !cfg!(debug_assertions) || cfg!(feature = "force-embed");
36
37    let assets = assets_to_code(asset_dir, &path, None, embed, log);
38
39    assets.parse().expect("Could not parse assets to code")
40}