use crate::*;
pub(crate) fn create_method_check(
method: &proc_macro2::Ident,
) -> impl FnOnce(&Ident) -> TokenStream2 {
let method_str: String = method.to_string();
move |context| {
let check_fn: proc_macro2::Ident = Ident::new(&format!("is_{method_str}"), context.span());
quote! {
if !#context.get_request().get_method().#check_fn() {
return;
}
}
}
}
pub(crate) fn methods_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let item_clone_1: TokenStream = item.clone();
let methods: RequestMethods = parse_macro_input!(attr as RequestMethods);
let input_fn: ItemFn = parse_macro_input!(item as ItemFn);
let sig: &Signature = &input_fn.sig;
match parse_context_from_signature(sig) {
Ok(context) => {
let method_checks = methods.methods.iter().map(|method| {
let method_str: String = method.to_string();
let check_fn: proc_macro2::Ident =
Ident::new(&format!("is_{method_str}"), method.span());
quote! {
#context.get_request().get_method().#check_fn()
}
});
inject(position, item_clone_1, |_| {
quote! {
if !(#(#method_checks)||*) {
return;
}
}
})
}
Err(err) => err.to_compile_error().into(),
}
}
macro_rules! impl_http_method_macro {
($name:ident, $submit_name:ident, $method:ident) => {
pub(crate) fn $name(item: TokenStream, position: Position) -> TokenStream {
inject(
position,
item,
create_method_check(&proc_macro2::Ident::new(
stringify!($method),
proc_macro2::Span::call_site(),
)),
)
}
};
}
impl_http_method_macro!(get_method_handler, get_method, get);
impl_http_method_macro!(post_method_handler, post_method, post);
impl_http_method_macro!(put_method_handler, put_method, put);
impl_http_method_macro!(delete_method_handler, delete_method, delete);
impl_http_method_macro!(patch_method_handler, patch_method, patch);
impl_http_method_macro!(head_method_handler, head_method, head);
impl_http_method_macro!(options_method_handler, options_method, options);
impl_http_method_macro!(connect_method_handler, connect_method, connect);
impl_http_method_macro!(trace_method_handler, trace_method, trace);
impl_http_method_macro!(unknown_method_handler, unknown_method, unknown);