route_controller 0.2.0

A procedural macro for generating Axum routers from controller-style implementations with support for route prefixing and middleware
Documentation
//! Controller implementation logic

use proc_macro::TokenStream;
use syn::{ItemImpl, parse_macro_input};

use crate::generator;
use crate::parser;

pub fn controller_impl(attr: TokenStream, item: TokenStream) -> TokenStream {
  let impl_block = parse_macro_input!(item as ItemImpl);
  let name = &impl_block.self_ty;

  log_verbose!(
    "Generating router for: [{}]",
    quote::quote! { #name }.to_string()
  );

  let config = parser::parse_controller_attributes(&attr);

  let route_registrations = generator::generate_route_registrations(&impl_block, &config);
  let base_router = generator::generate_base_router(&route_registrations);

  if route_registrations.is_empty() {
    log_info!("Warning: No routes found in controller");
    return TokenStream::from(generator::generate_router_impl(
      &impl_block,
      name,
      base_router,
      &config,
    ));
  }

  let router_with_middleware = generator::apply_middlewares(base_router, &config.middlewares);
  let final_router =
    generator::apply_route_prefix(router_with_middleware, config.route_prefix.as_ref());

  TokenStream::from(generator::generate_router_impl(
    &impl_block,
    name,
    final_router,
    &config,
  ))
}