tela_macros/
lib.rs

1extern crate proc_macro;
2mod docs;
3mod helpers;
4mod request;
5
6use proc_macro::TokenStream;
7use proc_macro2::TokenStream as TokenStream2;
8use proc_macro_error::proc_macro_error;
9
10use quote::quote;
11use syn::{parse_macro_input, ItemFn};
12
13use request::{request_catch, request_endpoint, CatchArgs, RequestArgs};
14
15macro_rules! request_method {
16    ($name: ident) => {
17        #[proc_macro_error]
18        #[proc_macro_attribute]
19        pub fn $name(args: TokenStream, function: TokenStream) -> TokenStream {
20            let mut args = parse_macro_input!(args as RequestArgs);
21            let function = parse_macro_input!(function as ItemFn);
22            args.methods = vec![stringify!($name).to_uppercase()];
23
24            request_endpoint(args, function)
25        }
26    };
27}
28
29#[proc_macro_error]
30#[proc_macro_attribute]
31pub fn request(args: TokenStream, function: TokenStream) -> TokenStream {
32    request_endpoint(
33        parse_macro_input!(args as RequestArgs),
34        parse_macro_input!(function as ItemFn),
35    )
36}
37
38request_method!(get);
39request_method!(post);
40request_method!(delete);
41request_method!(put);
42request_method!(options);
43request_method!(head);
44request_method!(trace);
45request_method!(connect);
46request_method!(patch);
47
48#[proc_macro_error]
49#[proc_macro_attribute]
50pub fn catch(args: TokenStream, function: TokenStream) -> TokenStream {
51    request_catch(
52        parse_macro_input!(args as CatchArgs),
53        parse_macro_input!(function as ItemFn),
54    )
55}
56
57#[proc_macro_error]
58#[proc_macro_attribute]
59pub fn main(_: TokenStream, function: TokenStream) -> TokenStream {
60    let function = parse_macro_input!(function as ItemFn);
61    let body = *function.block;
62
63    quote! {
64        #[tela::bump::tokio::main]
65        async fn main() -> std::result::Result<(), Box<dyn std::error::Error + Send + Sync>> {
66            #body
67        }
68    }
69    .into()
70}
71
72#[proc_macro]
73pub fn html(input: TokenStream) -> TokenStream {
74    let input: TokenStream2 = input.into();
75    quote! {
76        ::tela::response::HTML(
77            ::tela::prelude::html_raw! {
78                #input
79            }
80        )
81    }
82    .into()
83}