use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, LitStr};
#[proc_macro]
pub fn embed_dir(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as LitStr);
let dir_path = input.value();
let var_name = sanitize_identifier(&dir_path);
let var_ident = syn::Ident::new(&var_name, proc_macro2::Span::call_site());
let expanded = quote! {
{
use include_dir::include_dir;
static #var_ident: include_dir::Dir = include_dir!(#dir_path);
&#var_ident
}
};
TokenStream::from(expanded)
}
fn sanitize_identifier(s: &str) -> String {
let mut result = String::from("DIR_");
for c in s.chars() {
if c.is_ascii_alphanumeric() {
result.push(c.to_ascii_uppercase());
} else {
result.push('_');
}
}
result
}