1use convert_case::{Case, Casing};
2use modules::{delete_query_builder, update_query_builder};
3use modules::{insert_query_builder, one_query_builder};
4use proc_macro::TokenStream;
5use quote::quote;
6use syn::{parse_macro_input, DeriveInput};
7
8mod common;
9mod modules;
10use modules::dbset;
11use modules::from_row;
12use modules::many_query_builder;
13
14use common::utils::{self};
15
16#[proc_macro_derive(DbSet, attributes(unique, dbset, relation, auto, key))]
17pub fn dbset_derive(input: TokenStream) -> TokenStream {
18 let input = parse_macro_input!(input as DeriveInput);
19
20 let struct_name = &input.ident;
21 let dbset_name = utils::get_dbset_name(&input);
22
23 let many_query_builder_impl = many_query_builder::get_query_builder(&input);
24 let one_query_builder_impl = one_query_builder::get_query_builder(&input);
25 let insert_builder_impl = insert_query_builder::get_insert_query_builder(&input);
26 let update_builder_impl = update_query_builder::get_update_query_builder(&input);
27 let delete_builder_impl = delete_query_builder::get_query_builder(&input);
28
29 let from_row_impl = from_row::get_from_row_impl(&input);
32 let dbset_impl = dbset::get_dbset_impl(&input);
33
34 let module_name = quote::format_ident!(
35 "{}_module",
36 dbset_name
37 .to_string()
38 .from_case(Case::Pascal)
39 .to_case(Case::Snake)
40 );
41
42 let expanded = quote! {
43
44 mod #module_name {
45 use super::#struct_name ;
46
47 pub struct Set;
48 pub struct NotSet;
49
50 #from_row_impl
51 #many_query_builder_impl
52 #one_query_builder_impl
53 #insert_builder_impl
54 #update_builder_impl
55 #delete_builder_impl
56 #dbset_impl
57 }
58
59 pub use #module_name::#dbset_name;
60 };
61
62 TokenStream::from(expanded)
63}