algosul_derive/lib.rs
1use log::debug;
2use proc_macro::TokenStream;
3use syn::parse2;
4
5use crate::from_dir::InputBuf;
6mod filter;
7mod from_dir;
8mod tokens;
9/// Convert from folder to module
10/// # Grammar
11/// ```ignore
12/// // use
13/// from_dir!($module)
14/// // $module
15/// $vis mod $ident from $path {
16/// $($filter;)*
17/// }
18/// // $filter (text)
19/// text $file_filter
20/// // $filter (binary)
21/// binary $file_filter
22/// // $file_filter
23/// [$(include [$($path),*] exclude [$($path),*]),*]
24/// ```
25/// # Example
26/// ```
27/// # use algosul_derive::from_dir;
28/// from_dir!(mod assets from "../rc" {
29/// text [include ["lang/*.toml"] exclude []];
30/// binary [include ["images/*.png"] exclude []];
31/// });
32/// println!("en-US.toml: {}", assets::lang::en_US);
33/// println!("zh-CN.toml: {}", assets::lang::zh_CN);
34/// ```
35#[proc_macro]
36pub fn from_dir(input: TokenStream) -> TokenStream {
37 let _ = env_logger::try_init();
38 let path = proc_macro::Span::call_site().local_file().unwrap();
39 let base = path.parent().unwrap();
40 let input: InputBuf = parse2(input.into()).unwrap();
41 debug!("base: {base:?}, input: {:?}", input.path());
42 from_dir::from_dir(base, input.path(), input.as_ref()).unwrap().into()
43}