use proc_macro2::TokenStream as TokenStream2;
use syn::{parse2, spanned::Spanned, Error, ItemFn, Result};
use crate::util;
pub fn before(input: TokenStream2) -> Result<TokenStream2> {
let fun = parse2::<ItemFn>(input)?;
let ItemFn {
attrs,
vis,
mut sig,
block,
} = fun;
if sig.inputs.len() > 2 {
return Err(Error::new(
sig.inputs.span(),
"Function parameter must only be &SlashContext and &str",
));
}
let ident = sig.ident.clone();
let fn_ident = quote::format_ident!("_{}", &ident);
sig.ident = fn_ident.clone();
util::check_return_type(&sig.output, quote::quote!(bool))?;
let ty = util::get_context_type(&sig, true)?;
let hook = util::get_hook_macro();
let path = quote::quote!(::zephyrus::hook::BeforeHook);
Ok(quote::quote! {
pub fn #ident() -> #path<#ty> {
#path(#fn_ident)
}
#[#hook]
#(#attrs)*
#vis #sig #block
})
}