use proc_macro2::TokenStream as TokenStream2;
use syn::{parse2, spanned::Spanned, Error, ItemFn, Result};
use crate::util;
pub fn error_handler(input: TokenStream2) -> Result<TokenStream2> {
let fun = parse2::<ItemFn>(input)?;
let ItemFn {
attrs,
vis,
mut sig,
block,
} = fun;
match sig.inputs.len() {
c if c != 2 => {
return Err(Error::new(sig.inputs.span(), "Expected two arguments"));
}
_ => (),
};
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!(()))?;
let error_type = util::get_path(&util::get_pat(sig.inputs.iter().nth(1).unwrap())?.ty, false)?;
let ty = util::get_context_type(&sig, true)?;
let hook = util::get_hook_macro();
let path = quote::quote!(::zephyrus::hook::ErrorHandlerHook);
Ok(quote::quote! {
pub fn #ident() -> #path<#ty, #error_type> {
#path(#fn_ident)
}
#[#hook]
#(#attrs)*
#vis #sig #block
})
}