1use parse::parse_meta;
5use quote::quote;
6use syn::{parse_macro_input, DeriveInput, Expr, ItemFn, Meta};
7
8mod build;
9mod parse;
10
11use crate::build::{build_api_impl, build_api_methods, build_builder, build_macro_overrides};
12use crate::parse::parse_fields;
13
14#[proc_macro_attribute]
47pub fn http_api(
48 meta: proc_macro::TokenStream,
49 input: proc_macro::TokenStream,
50) -> proc_macro::TokenStream {
51 let metadata = parse_meta(meta);
52
53 let ast = parse_macro_input!(input as DeriveInput);
54 let vis = ast.vis;
55 let api_name = ast.ident;
56 let api_attrs = ast.attrs;
57 let (fields_decl, fields_init, fields_clone) = parse_fields(ast.data);
58
59 let (builder_name, builder_impl) =
60 build_builder(&metadata, vis.clone(), api_name.clone(), fields_init);
61 let api_impl = build_api_impl(
62 &metadata,
63 vis.clone(),
64 api_name.clone(),
65 api_attrs,
66 fields_decl,
67 fields_clone,
68 builder_name,
69 );
70 let methods = build_api_methods(vis.clone());
71
72 let output = quote! {
73 #api_impl
74 #builder_impl
75 impl #api_name {
76 #(#methods)*
77 }
78 };
79
80 output.into()
81}
82
83#[proc_macro_attribute]
85pub fn api_method(
86 meta: proc_macro::TokenStream,
87 input: proc_macro::TokenStream,
88) -> proc_macro::TokenStream {
89 let meta = syn::parse_macro_input!(meta as Meta);
90 let log_enabled = if let Meta::NameValue(name_value) = meta {
91 if name_value.path.is_ident("log") {
92 name_value.value
93 } else {
94 syn::parse_str::<Expr>("off").unwrap()
95 }
96 } else {
97 syn::parse_str::<Expr>("off").unwrap()
98 };
99
100 let item_fn = syn::parse_macro_input!(input as ItemFn);
101 let fn_vis = item_fn.vis;
102 let fn_sig = item_fn.sig;
103 let fn_block = item_fn.block;
104
105 let macros = build_macro_overrides(fn_sig.ident.clone());
106
107 let output = quote! {
108 #[allow(unused)]
109 #fn_vis #fn_sig {
110 #(#macros)*
111
112 Self::__REQ_CONFIG.set(apisdk::__internal::RequestConfigurator::new(apisdk::_function_path!(), Some(#log_enabled), false));
113 #fn_block
114 }
115 };
116
117 output.into()
118}
119
120