inline_sql_macros/
lib.rs

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}