sword-macros 0.3.0

Structured web framework built on top of tokio ecosystem, providing powerful features for building robust web applications.
Documentation
pub mod shared;

#[cfg(feature = "event-handlers")]
pub mod event_handler;

#[cfg(feature = "grpc-controllers")]
pub mod grpc;

#[cfg(feature = "socketio-controllers")]
pub mod socketio;

#[cfg(feature = "socketio-controllers")]
pub use socketio::expand_on_handler;

#[cfg(feature = "web-controllers")]
pub mod web;

use proc_macro::TokenStream;
use quote::quote;
use shared::ControllerStruct;
#[cfg(any(
    feature = "web-controllers",
    feature = "socketio-controllers",
    feature = "grpc-controllers",
    feature = "event-handlers",
))]
use shared::ParsedControllerKind;
use syn::ItemStruct;

pub fn expand_controller(attr: TokenStream, item: TokenStream) -> syn::Result<TokenStream> {
    let input = syn::parse::<ItemStruct>(item.clone())?;
    let parsed_input = ControllerStruct::parse(attr, item)?;

    let controller_kind = &parsed_input.kind;

    let builder: proc_macro::TokenStream = match controller_kind {
        #[cfg(feature = "web-controllers")]
        ParsedControllerKind::Web { .. } => web::expand_web_controller(&parsed_input)?,

        #[cfg(feature = "socketio-controllers")]
        ParsedControllerKind::SocketIo { .. } => {
            socketio::expand_socketio_controller(&parsed_input)?
        }

        #[cfg(feature = "grpc-controllers")]
        ParsedControllerKind::Grpc { .. } => grpc::expand_grpc_controller(&parsed_input)?,

        #[cfg(feature = "event-handlers")]
        ParsedControllerKind::EventHandler { .. } => {
            event_handler::expand_event_handler(&parsed_input)?
        }

        #[cfg(not(any(
            feature = "web-controllers",
            feature = "socketio-controllers",
            feature = "grpc-controllers",
            feature = "event-handlers",
        )))]
        _ => {
            return Err(syn::Error::new(
                proc_macro2::Span::call_site(),
                "no controller feature is enabled on `sword-macros`; enable `web-controllers`, `socketio-controllers`, `grpc-controllers`, or `event-handlers`",
            ));
        }
    };

    let builder = proc_macro2::TokenStream::from(builder);

    let expanded = quote! {
        #input
        #builder
    };

    Ok(TokenStream::from(expanded))
}