extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use std::env;
use std::fs;
#[proc_macro]
pub fn here(__input: TokenStream) -> TokenStream {
let __manifest_dir =
env::var("CARGO_MANIFEST_DIR").expect("Failed to get Cargo manifest directory");
let mut __macro_call_path =
fs::canonicalize(__manifest_dir).expect("Failed to canonicalize Cargo manifest directory");
__macro_call_path.push(__input.to_string().trim_matches('"'));
let __internal_module_names: Vec<String> = fs::read_dir(__macro_call_path)
.expect("Failed to read directory")
.filter_map(|entry| {
if let Ok(entry) = entry {
if let Some(entry_name) = entry.file_name().to_str() {
if entry_name.ends_with(".rs") && entry_name != "mod.rs" {
return Some(entry_name[..entry_name.len() - 3].to_owned());
} else if entry_name != "mod.rs" {
return Some(entry_name.to_owned());
}
}
}
None
})
.collect();
let __internal_module_array = quote! {
[
#(#__internal_module_names),*
]
};
let __number_of_modules_in_array = __internal_module_names.len();
let __internal_macro_output: proc_macro2::TokenStream = quote! {
pub const LIST: [&str; #__number_of_modules_in_array] = #__internal_module_array;
};
__internal_macro_output.into()
}