sword-macros 0.3.0

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

use crate::shared::*;
use parse::*;

use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use syn::ItemStruct;

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

    let injectable_impl = match parsed.kind {
        InjectableKind::Provider => generate_provider_trait(&parsed),
        InjectableKind::Component => generate_component_trait(&parsed),
    };

    let clone_impl = gen_clone(&parsed.struct_name, &parsed.fields);

    let mut expanded = quote! {
        #input
        #injectable_impl
    };

    if parsed.derive_clone {
        expanded.extend(quote! {
            #clone_impl
        });
    }

    Ok(expanded.into())
}

pub fn generate_component_trait(input: &InjectableInput) -> TokenStream2 {
    let struct_name = &input.struct_name;

    let deps_impl = gen_deps(struct_name, &input.fields);
    let build_impl = gen_build(struct_name, &input.fields);

    quote! {
        #build_impl
        #deps_impl
        impl ::sword::internal::core::Component for #struct_name {}
    }
}

pub fn generate_provider_trait(parsed: &InjectableInput) -> TokenStream2 {
    let struct_name = &parsed.struct_name;

    quote! {
        impl ::sword::internal::core::Provider for #struct_name {}
    }
}