luminol_proc_macros/
lib.rs

1use proc_macro::TokenStream;
2
3fn resolve_asset_path(path: String) -> String {
4    let path = path.strip_prefix("assets/").unwrap_or(&path);
5
6    let assets_path = std::env::var("LUMINOL_ASSETS_PATH").expect("luminol asset path not present");
7    let assets_path = std::path::PathBuf::from(assets_path);
8
9    let asset_path = assets_path.join(path);
10    asset_path.to_string_lossy().into_owned()
11}
12
13// TODO smarter asset system
14// We should probably have an `include_asset_static!` and an `include_asset_runtime!` as well as a system for registering assets
15#[proc_macro]
16pub fn include_asset(input: TokenStream) -> TokenStream {
17    let path: syn::LitStr = syn::parse(input).expect("Not a string literal");
18    let path = path.value();
19
20    let asset_path = resolve_asset_path(path);
21
22    let tokens = quote::quote! {
23        include_bytes!(#asset_path)
24    };
25    tokens.into()
26}
27
28#[proc_macro]
29pub fn include_asset_str(input: TokenStream) -> TokenStream {
30    let path: syn::LitStr = syn::parse(input).expect("Not a string literal");
31    let path = path.value();
32
33    let asset_path = resolve_asset_path(path);
34
35    let tokens = quote::quote! {
36        include_str!(#asset_path)
37    };
38    tokens.into()
39}