memory_serve_macros/
lib.rs1use 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}