sword-macros 0.2.1

Structured web framework built on top of tokio ecosystem, providing powerful features for building robust web applications.
Documentation
use proc_macro2::TokenStream;
use quote::quote;

use crate::{
    adapters::http::interceptor::expand_interceptor_args,
    shared::{CommonHttpAdapterInput, gen_build, gen_clone, gen_deps},
};

pub fn generate_controller_builder(input: &CommonHttpAdapterInput) -> TokenStream {
    let base_path = &input.base_path;
    let self_name = &input.struct_name;
    let self_fields = &input.fields;
    let controller_interceptors = &input.interceptors;

    let processed_interceptors: Vec<TokenStream> = controller_interceptors
        .iter()
        .map(expand_interceptor_args)
        .collect();

    let deps_impl = gen_deps(self_name, self_fields);
    let build_impl = gen_build(self_name, self_fields);
    let clone_impl = gen_clone(self_name, self_fields);

    quote! {
        #build_impl
        #deps_impl
        #clone_impl

        impl ::sword::internal::core::HttpController for #self_name {
            fn base_path() -> &'static str {
                #base_path
            }

            fn apply_interceptors(
                router: ::sword::internal::axum::AxumRouter<::sword::internal::core::State>,
                state: ::sword::internal::core::State,
            ) -> ::sword::internal::axum::AxumRouter<::sword::internal::core::State> {
                let mut result = router;
                #(
                    result = result.layer(#processed_interceptors);
                )*
                result
            }
        }

        impl ::sword::internal::core::Adapter for #self_name {
            fn kind() -> ::sword::internal::core::AdapterKind {
                ::sword::internal::core::AdapterKind::HttpController
            }

            fn type_id() -> ::std::any::TypeId {
                ::std::any::TypeId::of::<#self_name>()
            }
        }
    }
}