1mod argument;
2mod maybe_starts_with_dollar;
3mod nade;
4mod nade_helper;
5mod parameter;
6mod parameter_doc;
7mod path_attribute;
8
9use nade_helper::NadeHelper;
10use proc_macro::TokenStream;
11use quote::ToTokens;
12use syn::{parse_macro_input, ItemFn, Path};
13
14use crate::maybe_starts_with_dollar::StartsWithDollar;
15
16#[proc_macro_attribute]
17pub fn nade(attr: TokenStream, item: TokenStream) -> TokenStream {
18 let mut fun = parse_macro_input!(item as ItemFn);
19
20 let mut module_path: Option<StartsWithDollar<Path>> = None;
21
22 let module_path_parser = syn::meta::parser(|meta| {
23 if meta.path.is_ident("module_path") {
24 if module_path.is_some() {
25 return Err(meta.error("duplicate `module_path` argument"));
26 }
27 module_path = Some(meta.value()?.parse()?);
28 Ok(())
29 } else {
30 Err(meta.error("expected `module_path`"))
31 }
32 });
33
34 parse_macro_input!(attr with module_path_parser);
35
36 nade::generate(module_path, &mut fun)
37 .unwrap_or_else(|e| {
38 let mut stream = e.to_compile_error();
39 stream.extend(fun.to_token_stream());
40 stream
41 })
42 .into()
43}
44
45#[doc(hidden)]
46#[proc_macro]
47pub fn nade_helper(input: TokenStream) -> TokenStream {
48 let nade_helper = parse_macro_input!(input as NadeHelper);
49
50 nade_helper::generate(nade_helper)
51 .unwrap_or_else(|e| e.to_compile_error())
52 .into()
53}