1extern crate proc_macro;
2
3use backend::TableBackend as _;
4use dialect::pg::{group, row};
5use dialect::{pg, sqlite};
6
7mod backend;
8mod dialect;
9mod emit;
10mod ext;
11mod parse;
12mod plan;
13mod pred;
14mod shape;
15
16#[proc_macro_derive(PgTable, attributes(table_name, table))]
17pub fn pg_derive_table(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
18 let input = syn::parse_macro_input!(input as syn::DeriveInput);
19 match pg::PgBackend::derive_table(&input) {
20 Ok(ts) => ts.into(),
21 Err(e) => e.to_compile_error().into(),
22 }
23}
24
25#[proc_macro_derive(PgRow, attributes(row))]
26pub fn pg_derive_row(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
27 let input = syn::parse_macro_input!(input as syn::DeriveInput);
28 match row::Row(&input).emit() {
29 Ok(tokens) => tokens.into(),
30 Err(error) => error.to_compile_error().into(),
31 }
32}
33
34#[proc_macro_attribute]
35pub fn query_group(
36 attr: proc_macro::TokenStream,
37 item: proc_macro::TokenStream,
38) -> proc_macro::TokenStream {
39 if !attr.is_empty() {
40 return syn::Error::new_spanned(
41 proc_macro2::TokenStream::from(attr),
42 "#[query_group] takes no arguments",
43 )
44 .to_compile_error()
45 .into();
46 }
47 let block = syn::parse_macro_input!(item as syn::ItemImpl);
48 match group::Group::expand(block) {
49 Ok(ts) => ts.into(),
50 Err(e) => e.to_compile_error().into(),
51 }
52}
53
54#[proc_macro]
55pub fn pg_instance(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
56 match pg::PgBackend::expand(input) {
57 Ok(ts) => ts.into(),
58 Err(e) => e.to_compile_error().into(),
59 }
60}
61
62#[proc_macro_derive(Table, attributes(table_name))]
63pub fn sqlite_table(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
64 let input = syn::parse_macro_input!(input as syn::DeriveInput);
65 match sqlite::Backend::derive_table(&input) {
66 Ok(ts) => ts.into(),
67 Err(e) => e.to_compile_error().into(),
68 }
69}
70
71#[proc_macro_attribute]
72pub fn query(
73 attr: proc_macro::TokenStream,
74 item: proc_macro::TokenStream,
75) -> proc_macro::TokenStream {
76 if !attr.is_empty() {
77 return syn::Error::new_spanned(
78 proc_macro2::TokenStream::from(attr),
79 "#[query] takes no arguments",
80 )
81 .to_compile_error()
82 .into();
83 }
84 let f = syn::parse_macro_input!(item as syn::ItemFn);
85 match sqlite::Query::expand(&f) {
86 Ok(ts) => ts.into(),
87 Err(e) => e.to_compile_error().into(),
88 }
89}
90
91#[proc_macro]
92pub fn catalog(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
93 match sqlite::Catalog::from_tokens(input) {
94 Ok(tokens) => tokens.into(),
95 Err(error) => error.to_compile_error().into(),
96 }
97}