sqlx_exasol_macros/
lib.rs

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