1#![allow(clippy::too_many_arguments)]
2
3extern crate proc_macro;
4
5use backend::Backend;
6use proc_macro::TokenStream;
7use syn::{DeriveInput, ItemImpl, parse_macro_input};
8
9mod backend;
10mod build;
11mod derive_table;
12mod emit;
13mod parse;
14mod pg;
15mod row_meta;
16mod shape;
17mod sqlite;
18mod util;
19mod where_clause;
20
21#[proc_macro_derive(PgTable, attributes(pk, table_name))]
22pub fn pg_derive_table(input: TokenStream) -> TokenStream {
23 let input = parse_macro_input!(input as DeriveInput);
24 match pg::PgBackend::derive_table(&input) {
25 Ok(ts) => ts.into(),
26 Err(e) => e.to_compile_error().into(),
27 }
28}
29
30#[proc_macro_attribute]
31pub fn query_group(_attr: TokenStream, item: TokenStream) -> TokenStream {
32 let block = parse_macro_input!(item as ItemImpl);
33 match pg::PgBackend::expand_query_group(block) {
34 Ok(ts) => ts.into(),
35 Err(e) => e.to_compile_error().into(),
36 }
37}
38
39#[proc_macro]
40pub fn pg_instance(input: TokenStream) -> TokenStream {
41 match pg::PgBackend::expand_instance(input) {
42 Ok(ts) => ts.into(),
43 Err(e) => e.to_compile_error().into(),
44 }
45}
46
47#[proc_macro_derive(SqliteTable, attributes(pk, table_name))]
48pub fn sqlite_derive_table(input: TokenStream) -> TokenStream {
49 let input = parse_macro_input!(input as DeriveInput);
50 match sqlite::SqliteBackend::derive_table(&input) {
51 Ok(ts) => ts.into(),
52 Err(e) => e.to_compile_error().into(),
53 }
54}
55
56#[proc_macro_attribute]
57pub fn sqlite_query(attr: TokenStream, item: TokenStream) -> TokenStream {
58 let f = parse_macro_input!(item as syn::ItemFn);
59 let no_probe = attr.to_string().contains("no_probe");
60 match sqlite::SqliteBackend::query_free(f, no_probe) {
61 Ok(ts) => ts.into(),
62 Err(e) => e.to_compile_error().into(),
63 }
64}