1use darling::FromMeta;
2use proc_macro::TokenStream;
3use syn::{parse_macro_input, ItemFn};
4
5mod expand;
6mod helper;
7mod parse;
8
9use helper::AttributeArgs;
10use parse::MainAttr;
11
12#[proc_macro_attribute]
13pub fn main(attr_input: TokenStream, item_input: TokenStream) -> TokenStream {
14 let item_ast = parse_macro_input!(item_input as ItemFn);
15 let attr_ast = parse_macro_input!(attr_input as AttributeArgs);
16 let attr: MainAttr = match FromMeta::from_list(&attr_ast) {
17 Ok(attr) => attr,
18 Err(errs) => return TokenStream::from(errs.write_errors()),
19 };
20
21 attr.expand(&item_ast).into()
22}