use proc_macro2::TokenStream as TokenStream2;
use syn::{parse2, spanned::Spanned, Error, ItemFn, Result};
pub fn after(input: TokenStream2) -> Result<TokenStream2> {
let fun = parse2::<ItemFn>(input)?;
let ItemFn {
attrs,
vis,
mut sig,
block,
} = fun;
match sig.inputs.len() {
c if c != 3 => {
return Err(Error::new(sig.inputs.span(), "Expected three arguments"));
}
_ => (),
};
let ident = sig.ident.clone();
let fn_ident = quote::format_ident!("_{}", &ident);
sig.ident = fn_ident.clone();
crate::util::check_return_type(&sig.output, quote::quote!(()))?;
let (_, ty) = crate::util::get_context_type_and_ident(&sig)?;
let futurize = crate::util::get_futurize_macro();
let path = quote::quote!(::zephyrus::hook::AfterHook);
Ok(quote::quote! {
pub fn #ident() -> #path<#ty> {
#path(#fn_ident)
}
#[#futurize]
#(#attrs)*
#vis #sig #block
})
}