hooks_macro/
lib.rs

1use proc_macro::TokenStream;
2
3use hooks_macro_core::{
4    darling::{self, ast::NestedMeta, FromMeta},
5    proc_macro2,
6    quote::ToTokens,
7    syn::{parse_macro_input, ItemFn},
8};
9
10#[proc_macro_attribute]
11pub fn hook(args: TokenStream, input: TokenStream) -> TokenStream {
12    let attr_args = match NestedMeta::parse_meta_list(args.into()) {
13        Ok(v) => v,
14        Err(e) => {
15            return TokenStream::from(darling::Error::from(e).write_errors());
16        }
17    };
18
19    let args = match ::hooks_macro_core::HookArgs::from_list(&attr_args) {
20        Ok(v) => v,
21        Err(e) => {
22            return TokenStream::from(e.write_errors());
23        }
24    };
25
26    let item_fn = parse_macro_input!(input as ItemFn);
27
28    let (item_fn, error) = args.transform_item_fn(item_fn);
29
30    let item_fn = item_fn.into_token_stream();
31
32    if let Some(error) = error {
33        proc_macro2::TokenStream::from_iter([item_fn, error.write_errors()])
34    } else {
35        item_fn
36    }
37    .into()
38}