1use attribute_utils::update_openapi_macro_attributes;
2use proc_macro::TokenStream;
3
4use quote::quote;
5use string_utils::{discover, extract_paths};
6use syn::parse_macro_input;
7use token_utils::{check_macro_placement, extract_attributes, output_macro};
8use utoipauto_core::{attribute_utils, string_utils, token_utils};
9
10#[proc_macro_attribute]
13pub fn utoipauto(
14 attributes: proc_macro::TokenStream, item: proc_macro::TokenStream, ) -> proc_macro::TokenStream {
17 let params = extract_attributes(attributes.into());
19 let paths: Vec<String> = extract_paths(¶ms.paths);
21
22 let mut openapi_macro = parse_macro_input!(item as syn::ItemStruct);
24
25 let (uto_paths, uto_models, uto_responses): (String, String, String) = discover(paths, ¶ms);
27
28 let openapi_macro_attibutes = &mut openapi_macro.attrs;
30
31 check_macro_placement(openapi_macro_attibutes.clone());
33
34 update_openapi_macro_attributes(openapi_macro_attibutes, &uto_paths, &uto_models, &uto_responses);
36
37 output_macro(openapi_macro)
39}
40
41#[proc_macro_attribute]
43pub fn utoipa_ignore(_attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream {
44 let input = parse_macro_input!(item as syn::Item);
45 let code = quote!(
46 #input
47 );
48
49 TokenStream::from(code)
50}
51
52#[proc_macro_attribute]
54pub fn test_handler(_attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream {
55 let input = parse_macro_input!(item as syn::ItemFn);
56
57 let code = quote!(
58 #[utoipa::path(get, path = "/")]
59 #input
60 );
61
62 TokenStream::from(code)
63}