Skip to main content

sql_macros_derive/
lib.rs

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
16/// Parses the derive input, builds the shared `TableModel`, runs `codegen`,
17/// and turns any error (attribute parsing or codegen validation) into a
18/// span-accurate `compile_error!` instead of panicking.
19fn 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}