algosul_derive/
lib.rs

1use log::debug;
2use proc_macro::TokenStream;
3use quote::ToTokens;
4use syn::parse2;
5
6mod from_dir;
7mod index;
8/// Convert from folder to module
9/// # Grammar
10/// ```text
11/// // use
12/// from_dir!($module)
13/// // $module
14/// $vis mod $ident from $path {
15///     $($filter;)*
16/// }
17/// // $filter (text)
18/// text $file_filter
19/// // $filter (binary)
20/// binary $file_filter
21/// // $file_filter
22/// [$(include [$($path),*] exclude [$($path),*]),*]
23/// ```
24/// # Example
25/// ```
26/// # use algosul_derive::from_dir;
27/// from_dir!(mod assets from "../rc" {
28///     text [include ["lang/*.toml"] exclude []];
29///     binary [include ["images/*.png"] exclude []];
30/// });
31/// println!("en-US.toml: {}", assets::lang::en_US);
32/// println!("zh-CN.toml: {}", assets::lang::zh_CN);
33/// ```
34#[proc_macro]
35pub fn from_dir(input: TokenStream) -> TokenStream
36{
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: from_dir::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}
44#[proc_macro]
45pub fn get(input: TokenStream) -> TokenStream
46{
47  let _ = env_logger::try_init();
48  let path = proc_macro::Span::call_site().local_file().unwrap();
49  let base = path.parent().unwrap();
50  let input: index::InputBuf = parse2(input.into()).unwrap();
51  debug!("base: {base:?}, input: {:?}", input.expr().into_token_stream());
52  index::get(input).unwrap().into()
53}