1use proc_macro2::TokenStream;
2use quote::quote;
3
4mod input;
5mod expand;
6mod util;
7
8#[proc_macro_attribute]
9pub fn inline_sql(params: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream {
10 let mut errors = Vec::new();
11 let output = inline_sql_impl(&mut errors, params.into(), item.into());
12
13 let errors = errors.iter().map(|x| x.to_compile_error());
14 quote! {
15 #(#errors)*
16 #output
17 }.into()
18}
19
20fn inline_sql_impl(errors: &mut Vec<syn::Error>, params: TokenStream, item: TokenStream) -> TokenStream {
21 let mut args = input::Arguments::new();
22 args.parse_params(errors, params, None);
23
24 let item: input::Item = match syn::parse2(item.clone()) {
25 Ok(x) => x,
26 Err(e) => {
27 errors.push(e);
28 return item;
29 }
30 };
31
32 match item {
33 input::Item::Function(function) => expand::expand_sql_function(errors, function, args),
34 }
35}