use crate::*;
pub(crate) fn task_panic_macro(attr: TokenStream, item: TokenStream) -> TokenStream {
let attr_args: OrderAttr = parse_macro_input!(attr as OrderAttr);
let order: TokenStream2 = expr_to_isize(&attr_args.order);
let input_struct: ItemStruct = parse_macro_input!(item as ItemStruct);
let struct_name: &Ident = &input_struct.ident;
let gen_code: TokenStream2 = quote! {
#input_struct
::hyperlane::inventory::submit! {
::hyperlane::HookType::TaskPanic(#order, || ::hyperlane::server_hook_factory::<#struct_name>())
}
};
gen_code.into()
}
pub(crate) fn request_error_macro(attr: TokenStream, item: TokenStream) -> TokenStream {
let attr_args: OrderAttr = parse_macro_input!(attr as OrderAttr);
let order: TokenStream2 = expr_to_isize(&attr_args.order);
let input_struct: ItemStruct = parse_macro_input!(item as ItemStruct);
let struct_name: &Ident = &input_struct.ident;
let gen_code: TokenStream2 = quote! {
#input_struct
::hyperlane::inventory::submit! {
::hyperlane::HookType::RequestError(#order, || ::hyperlane::server_hook_factory::<#struct_name>())
}
};
gen_code.into()
}
pub(crate) fn prologue_hooks_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let functions: Punctuated<Expr, Token![,]> =
parse_macro_input!(attr with Punctuated::parse_terminated);
inject(position, item, |context| {
let hook_calls = functions.iter().map(|function_expr| {
quote! {
let _ = #function_expr(#context).await;
}
});
quote! {
#(#hook_calls)*
}
})
}
pub(crate) fn epilogue_hooks_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let functions: Punctuated<Expr, Token![,]> =
parse_macro_input!(attr with Punctuated::parse_terminated);
inject(position, item, |context| {
let hook_calls = functions.iter().map(|function_expr| {
quote! {
let _ = #function_expr(#context).await;
}
});
quote! {
#(#hook_calls)*
}
})
}