tela-macros 0.1.2

Tela web frameworks macros
Documentation
extern crate proc_macro;
mod docs;
mod helpers;
mod request;

use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
use proc_macro_error::proc_macro_error;

use quote::quote;
use syn::{parse_macro_input, ItemFn};

use request::{request_catch, request_endpoint, CatchArgs, RequestArgs};

macro_rules! request_method {
    ($name: ident) => {
        #[proc_macro_error]
        #[proc_macro_attribute]
        pub fn $name(args: TokenStream, function: TokenStream) -> TokenStream {
            let mut args = parse_macro_input!(args as RequestArgs);
            let function = parse_macro_input!(function as ItemFn);
            args.methods = vec![stringify!($name).to_uppercase()];

            request_endpoint(args, function)
        }
    };
}

#[proc_macro_error]
#[proc_macro_attribute]
pub fn request(args: TokenStream, function: TokenStream) -> TokenStream {
    request_endpoint(
        parse_macro_input!(args as RequestArgs),
        parse_macro_input!(function as ItemFn),
    )
}

request_method!(get);
request_method!(post);
request_method!(delete);
request_method!(put);
request_method!(options);
request_method!(head);
request_method!(trace);
request_method!(connect);
request_method!(patch);

#[proc_macro_error]
#[proc_macro_attribute]
pub fn catch(args: TokenStream, function: TokenStream) -> TokenStream {
    request_catch(
        parse_macro_input!(args as CatchArgs),
        parse_macro_input!(function as ItemFn),
    )
}

#[proc_macro_error]
#[proc_macro_attribute]
pub fn main(_: TokenStream, function: TokenStream) -> TokenStream {
    let function = parse_macro_input!(function as ItemFn);
    let body = *function.block;

    quote! {
        #[tela::bump::tokio::main]
        async fn main() -> std::result::Result<(), Box<dyn std::error::Error + Send + Sync>> {
            #body
        }
    }
    .into()
}

#[proc_macro]
pub fn html(input: TokenStream) -> TokenStream {
    let input: TokenStream2 = input.into();
    quote! {
        ::tela::response::HTML(
            ::tela::prelude::html_raw! {
                #input
            }
        )
    }
    .into()
}