1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use darling::FromMeta;
use proc_macro::TokenStream;
use proc_macro_error::{abort, proc_macro_error};
use route::HttpMethod;

mod route;
mod schematic;

pub(crate)  mod utils;

macro_rules! handler {
    ($name:tt, $method: expr) => {
        #[proc_macro_attribute]
        pub fn $name(args: TokenStream, input_stream: TokenStream) -> TokenStream {
            route::request_handler($method, args, input_stream)
        }
    };
}
handler!(get, HttpMethod::Get);
handler!(post, HttpMethod::Post);
handler!(put, HttpMethod::Put);
handler!(patch, HttpMethod::Patch);
handler!(delete, HttpMethod::Delete);
handler!(options, HttpMethod::Options);
handler!(connect, HttpMethod::Connect);
handler!(head, HttpMethod::Head);
handler!(trace, HttpMethod::Trace);

#[proc_macro_derive(Schematic, attributes(schematic))]
#[proc_macro_error]
pub fn derive_parameter(input: TokenStream) -> TokenStream {
    let stream2 = proc_macro2::TokenStream::from(input);
    match schematic::handler(stream2) {
        Ok(stream) => proc_macro::TokenStream::from(stream),
        Err((span, msg)) => abort! {span, msg},
    }
}