sqlx_exasol_macros/
lib.rs

1#![cfg_attr(not(test), warn(unused_crate_dependencies))]
2
3mod parse;
4
5#[allow(unused_imports, reason = "built-in; conditionally compiled")]
6use proc_macro::TokenStream;
7
8#[cfg(feature = "macros")]
9#[proc_macro]
10pub fn expand_query(input: TokenStream) -> TokenStream {
11    let input = syn::parse_macro_input!(input as sqlx_macros_core::query::QueryMacroInput);
12
13    match sqlx_macros_core::query::expand_input(input, &[sqlx_exasol_impl::QUERY_DRIVER]) {
14        Ok(ts) => parse::rewrite(ts).into(),
15        Err(e) => {
16            if let Some(parse_err) = e.downcast_ref::<syn::Error>() {
17                parse_err.to_compile_error().into()
18            } else {
19                let msg = e.to_string();
20                quote::quote!(::std::compile_error!(#msg)).into()
21            }
22        }
23    }
24}
25
26#[cfg(feature = "derive")]
27#[proc_macro_derive(Encode, attributes(sqlx))]
28pub fn derive_encode(tokenstream: TokenStream) -> TokenStream {
29    let input = syn::parse_macro_input!(tokenstream as syn::DeriveInput);
30    match sqlx_macros_core::derives::expand_derive_encode(&input) {
31        Ok(ts) => parse::rewrite(ts).into(),
32        Err(e) => e.to_compile_error().into(),
33    }
34}
35
36#[cfg(feature = "derive")]
37#[proc_macro_derive(Decode, attributes(sqlx))]
38pub fn derive_decode(tokenstream: TokenStream) -> TokenStream {
39    let input = syn::parse_macro_input!(tokenstream as syn::DeriveInput);
40    match sqlx_macros_core::derives::expand_derive_decode(&input) {
41        Ok(ts) => parse::rewrite(ts).into(),
42        Err(e) => e.to_compile_error().into(),
43    }
44}
45
46#[cfg(feature = "derive")]
47#[proc_macro_derive(Type, attributes(sqlx))]
48pub fn derive_type(tokenstream: TokenStream) -> TokenStream {
49    let input = syn::parse_macro_input!(tokenstream as syn::DeriveInput);
50    match sqlx_macros_core::derives::expand_derive_type_encode_decode(&input) {
51        Ok(ts) => parse::rewrite(ts).into(),
52        Err(e) => e.to_compile_error().into(),
53    }
54}
55
56#[cfg(feature = "derive")]
57#[proc_macro_derive(FromRow, attributes(sqlx))]
58pub fn derive_from_row(input: TokenStream) -> TokenStream {
59    let input = syn::parse_macro_input!(input as syn::DeriveInput);
60
61    match sqlx_macros_core::derives::expand_derive_from_row(&input) {
62        Ok(ts) => parse::rewrite(ts).into(),
63        Err(e) => e.to_compile_error().into(),
64    }
65}
66
67#[cfg(feature = "migrate")]
68#[proc_macro]
69pub fn migrate(input: TokenStream) -> TokenStream {
70    let input = syn::parse_macro_input!(input as Option<syn::LitStr>);
71    match sqlx_macros_core::migrate::expand(input) {
72        // Wrap the TokenStream in a block so it can be parsed as a syn::Stmt.
73        // Otherwise we'd have to special case this to a syn::Expr.
74        //
75        // NOTE: Stmt::Expr variant does not normally apply here!
76        Ok(ts) => parse::rewrite(quote::quote!({#ts})).into(),
77        Err(e) => {
78            if let Some(parse_err) = e.downcast_ref::<syn::Error>() {
79                parse_err.to_compile_error().into()
80            } else {
81                let msg = e.to_string();
82                quote::quote!(::std::compile_error!(#msg)).into()
83            }
84        }
85    }
86}
87
88#[cfg(feature = "macros")]
89#[proc_macro_attribute]
90pub fn test(args: TokenStream, input: TokenStream) -> TokenStream {
91    let input = syn::parse_macro_input!(input as syn::ItemFn);
92
93    match sqlx_macros_core::test_attr::expand(args.into(), input) {
94        Ok(ts) => parse::rewrite(ts).into(),
95        Err(e) => {
96            if let Some(parse_err) = e.downcast_ref::<syn::Error>() {
97                parse_err.to_compile_error().into()
98            } else {
99                let msg = e.to_string();
100                quote::quote!(::std::compile_error!(#msg)).into()
101            }
102        }
103    }
104}