algosul_derive/
lib.rs

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