1use proc_macro::TokenStream;
2
3mod attrs;
4mod delete;
5mod insert;
6mod insert_many;
7mod model;
8mod select;
9mod select_all;
10mod select_many;
11mod table;
12mod update;
13
14use model::TableModel;
15
16fn run(
20 input: TokenStream,
21 codegen: impl FnOnce(&TableModel) -> darling::Result<proc_macro2::TokenStream>,
22) -> TokenStream {
23 let derive_input = syn::parse_macro_input!(input as syn::DeriveInput);
24 let result = TableModel::from_derive_input(&derive_input).and_then(|model| codegen(&model));
25 match result {
26 Ok(tokens) => tokens.into(),
27 Err(err) => err.write_errors().into(),
28 }
29}
30
31#[proc_macro_derive(SqlSelect, attributes(table))]
32pub fn sql_select_macro_derive(input: TokenStream) -> TokenStream {
33 run(input, select::expand)
34}
35
36#[proc_macro_derive(SqlSelectAll, attributes(table))]
37pub fn sql_select_all_macro_derive(input: TokenStream) -> TokenStream {
38 run(input, select_all::expand)
39}
40
41#[proc_macro_derive(SqlSelectMany, attributes(table))]
42pub fn sql_select_many_macro_derive(input: TokenStream) -> TokenStream {
43 run(input, select_many::expand)
44}
45
46#[proc_macro_derive(SqlInsert, attributes(table))]
47pub fn sql_insert_macro_derive(input: TokenStream) -> TokenStream {
48 run(input, insert::expand)
49}
50
51#[proc_macro_derive(SqlInsertMany, attributes(table))]
52pub fn sql_insert_many_macro_derive(input: TokenStream) -> TokenStream {
53 run(input, insert_many::expand)
54}
55
56#[proc_macro_derive(SqlUpdate, attributes(table))]
57pub fn sql_update_macro_derive(input: TokenStream) -> TokenStream {
58 run(input, update::expand)
59}
60
61#[proc_macro_derive(SqlDelete, attributes(table))]
62pub fn sql_delete_macro_derive(input: TokenStream) -> TokenStream {
63 run(input, delete::expand)
64}
65
66#[proc_macro_derive(SqlTable, attributes(table))]
67pub fn sql_table_macro_derive(input: TokenStream) -> TokenStream {
68 run(input, table::expand)
69}