Skip to main content

nade_macro/
lib.rs

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}