use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use crate::parse;
pub fn route_macro(
http_method: &str,
axum_fn: &str,
attr: TokenStream,
item: TokenStream,
) -> TokenStream {
let path = match parse::parse_route_path(attr) {
Ok(p) => p,
Err(err) => return err,
};
let mut input_fn = match parse::parse_async_handler(item) {
Ok(f) => f,
Err(err) => return err,
};
let interceptors = parse::extract_interceptors(&mut input_fn.attrs);
let fn_name = &input_fn.sig.ident;
let route_info_name = format_ident!("__autumn_route_info_{}", fn_name);
let vis = &input_fn.vis;
let method_const = format_ident!("{}", http_method); let routing_fn = format_ident!("{}", axum_fn);
let mut handler_expr: TokenStream =
quote! { ::autumn_web::reexports::axum::routing::#routing_fn(#fn_name) };
for interceptor in interceptors.iter().rev() {
handler_expr = quote! {
::autumn_web::reexports::axum::routing::MethodRouter::<
::autumn_web::AppState, ::core::convert::Infallible
>::layer(#handler_expr, #interceptor)
};
}
quote! {
#input_fn
#[doc(hidden)]
#vis fn #route_info_name() -> ::autumn_web::Route {
::autumn_web::Route {
method: ::autumn_web::reexports::http::Method::#method_const,
path: #path,
handler: #handler_expr,
name: ::core::stringify!(#fn_name),
}
}
}
}