Skip to main content

cartel_gen/
lib.rs

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}