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}