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}