1extern crate proc_macro;
2use self::route::compile_route;
3use pmutil::{q, ToTokensExt};
4
5mod openapi;
6mod parse;
7mod path;
8mod route;
9mod router;
10mod util;
11
12#[proc_macro_attribute]
13pub fn get(
14 path: proc_macro::TokenStream,
15 fn_item: proc_macro::TokenStream,
16) -> proc_macro::TokenStream {
17 compile_route(Some(q!({ get })), path.into(), fn_item.into())
18}
19
20#[proc_macro_attribute]
21pub fn post(
22 path: proc_macro::TokenStream,
23 fn_item: proc_macro::TokenStream,
24) -> proc_macro::TokenStream {
25 compile_route(Some(q!({ post })), path.into(), fn_item.into())
26}
27
28#[proc_macro_attribute]
29pub fn put(
30 path: proc_macro::TokenStream,
31 fn_item: proc_macro::TokenStream,
32) -> proc_macro::TokenStream {
33 compile_route(Some(q!({ put })), path.into(), fn_item.into())
34}
35
36#[proc_macro_attribute]
37pub fn delete(
38 path: proc_macro::TokenStream,
39 fn_item: proc_macro::TokenStream,
40) -> proc_macro::TokenStream {
41 compile_route(Some(q!({ delete })), path.into(), fn_item.into())
42}
43
44#[proc_macro_attribute]
45pub fn head(
46 path: proc_macro::TokenStream,
47 fn_item: proc_macro::TokenStream,
48) -> proc_macro::TokenStream {
49 compile_route(Some(q!({ head })), path.into(), fn_item.into())
50}
51
52#[proc_macro_attribute]
53pub fn options(
54 path: proc_macro::TokenStream,
55 fn_item: proc_macro::TokenStream,
56) -> proc_macro::TokenStream {
57 compile_route(Some(q!({ options })), path.into(), fn_item.into())
58}
59
60#[proc_macro_attribute]
61pub fn patch(
62 path: proc_macro::TokenStream,
63 fn_item: proc_macro::TokenStream,
64) -> proc_macro::TokenStream {
65 compile_route(Some(q!({ patch })), path.into(), fn_item.into())
66}
67
68#[proc_macro_attribute]
75pub fn router(
76 attr: proc_macro::TokenStream,
77 item: proc_macro::TokenStream,
78) -> proc_macro::TokenStream {
79 router::router(attr.into(), item.into()).dump().into()
80}
81
82#[proc_macro_derive(Schema, attributes(schema))]
86pub fn derive_schema(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
87 if !cfg!(feature = "openapi") {
88 return "".parse().unwrap();
89 }
90 let input = syn::parse::<syn::DeriveInput>(input).expect("failed to parse derive input");
91 openapi::derive_schema(input).into()
92}