algosul_derive/
lib.rs

1use std::borrow::Cow;
2
3use itertools::Itertools;
4use log::trace;
5use proc_macro::TokenStream;
6use syn::parse2;
7
8use crate::from_dir::Input;
9mod array;
10mod filter;
11mod from_dir;
12/// # Examples
13///
14/// ```
15/// # use algosul_derive::from_dir;
16/// from_dir!(
17///     pub mod asset from "/path/to/asset" filter [
18///         include ["**"] exclude []
19///     ]
20/// );
21/// ```
22#[proc_macro]
23pub fn from_dir(input: TokenStream) -> TokenStream {
24    let _ = env_logger::try_init();
25    let path = proc_macro::Span::call_site().local_file().unwrap();
26    let base = path.parent().unwrap();
27    let mut input: Input = parse2(input.into()).unwrap();
28    input.path = Cow::Owned(base.join(&input.path));
29    let debug: Vec<_> = input
30        .filter
31        .items
32        .iter()
33        .map(|item| {
34            let includes: Vec<_> =
35                item.includes.iter().map(|item| item.as_str()).collect();
36            let excludes: Vec<_> =
37                item.excludes.iter().map(|item| item.as_str()).collect();
38            format!("include {includes:?} exclude {excludes:?}")
39        })
40        .collect();
41    trace!("filter {debug:?}");
42    from_dir::from_dir(base, input).unwrap().into()
43}