1mod controller;
2mod method;
3mod multi_request_media_type;
4mod multi_response;
5mod multi_response_media_type;
6mod multipart;
7mod schema_attr;
8mod security_scheme;
9mod serde_attr;
10mod single_response;
11mod tag;
12mod to_parameters;
13mod to_schema;
14mod types;
15mod util;
16
17use from_attr::FromAttr;
18use proc_macro::TokenStream;
19use syn::{parse_macro_input, DeriveInput, ItemImpl};
20
21#[proc_macro_attribute]
22pub fn controller(attr: TokenStream, item: TokenStream) -> TokenStream {
23 let attr = match controller::ControllerAttr::from_tokens(attr.into()) {
24 Ok(attr) => attr,
25 Err(e) => return e.to_compile_error().into(),
26 };
27 let item_impl = parse_macro_input!(item as ItemImpl);
28
29 controller::generate(attr, item_impl)
30 .unwrap_or_else(|e| e.to_compile_error())
31 .into()
32}
33
34#[proc_macro_derive(ToSchema, attributes(schema))]
35pub fn to_schema(input: TokenStream) -> TokenStream {
36 let input = parse_macro_input!(input as DeriveInput);
37
38 to_schema::generate(input)
39 .unwrap_or_else(|e| e.to_compile_error())
40 .into()
41}
42
43#[proc_macro_derive(ToParameters, attributes(schema))]
44pub fn to_parameters(input: TokenStream) -> TokenStream {
45 let input = parse_macro_input!(input as DeriveInput);
46
47 to_parameters::generate(input)
48 .unwrap_or_else(|e| e.to_compile_error())
49 .into()
50}
51
52#[doc = include_str!("docs/multi_request_media_type.md")]
53#[proc_macro_derive(MultiRequestMediaType, attributes(multi_request_media_type))]
54pub fn multi_request_media_type(input: TokenStream) -> TokenStream {
55 let input = parse_macro_input!(input as DeriveInput);
56
57 multi_request_media_type::generate(input)
58 .unwrap_or_else(|e| e.to_compile_error())
59 .into()
60}
61
62#[doc = include_str!("docs/multi_response_media_type.md")]
63#[proc_macro_derive(MultiResponseMediaType, attributes(multi_response_media_type))]
64pub fn multi_response_media_type(input: TokenStream) -> TokenStream {
65 let input = parse_macro_input!(input as DeriveInput);
66
67 multi_response_media_type::generate(input)
68 .unwrap_or_else(|e| e.to_compile_error())
69 .into()
70}
71
72#[doc = include_str!("docs/single_response.md")]
73#[proc_macro_derive(SingleResponse, attributes(single_response, header))]
74pub fn single_response(input: TokenStream) -> TokenStream {
75 let input = parse_macro_input!(input as DeriveInput);
76
77 single_response::generate(input)
78 .unwrap_or_else(|e| e.to_compile_error())
79 .into()
80}
81
82#[doc = include_str!("docs/multi_response.md")]
83#[proc_macro_derive(MultiResponse, attributes(multi_response, status))]
84pub fn multi_response(input: TokenStream) -> TokenStream {
85 let input = parse_macro_input!(input as DeriveInput);
86
87 multi_response::generate(input)
88 .unwrap_or_else(|e| e.to_compile_error())
89 .into()
90}
91
92#[doc = include_str!("docs/multipart.md")]
93#[proc_macro_derive(Multipart, attributes(schema))]
94pub fn multipart(input: TokenStream) -> TokenStream {
95 let input = parse_macro_input!(input as DeriveInput);
96
97 multipart::generate(input)
98 .unwrap_or_else(|e| e.to_compile_error())
99 .into()
100}
101
102#[doc = include_str!("docs/tag.md")]
103#[proc_macro_derive(Tag, attributes(tag))]
104pub fn tag(input: TokenStream) -> TokenStream {
105 let input = parse_macro_input!(input as DeriveInput);
106
107 tag::generate(input)
108 .unwrap_or_else(|e| e.to_compile_error())
109 .into()
110}
111
112#[doc = include_str!("docs/security_scheme.md")]
113#[proc_macro_derive(SecurityScheme, attributes(api_key, http))]
114pub fn security_scheme(input: TokenStream) -> TokenStream {
115 let input = parse_macro_input!(input as DeriveInput);
116
117 security_scheme::generate(input)
118 .unwrap_or_else(|e| e.to_compile_error())
119 .into()
120}