1use darling::{ast::NestedMeta, FromMeta};
2use proc_macro::TokenStream;
3use syn::parse_macro_input;
4
5mod db_bmc;
6mod helpers;
7mod insert;
8mod select;
9mod store_enum;
10mod update;
11mod uuid_id;
12
13#[proc_macro_derive(Select, attributes(select))]
14pub fn select(item: TokenStream) -> TokenStream {
15 let input = parse_macro_input!(item as syn::DeriveInput);
16 select::select_impl(&input).unwrap_or_else(|e| e.to_compile_error().into())
17}
18
19#[proc_macro_derive(Insert, attributes(insert))]
20pub fn insert(item: TokenStream) -> TokenStream {
21 let input = parse_macro_input!(item as syn::DeriveInput);
22 insert::insert_impl(&input).unwrap_or_else(|e| e.to_compile_error().into())
23}
24
25#[proc_macro_derive(Update, attributes(update))]
26pub fn update(item: TokenStream) -> TokenStream {
27 let input = parse_macro_input!(item as syn::DeriveInput);
28 update::update_impl(&input).unwrap_or_else(|e| e.to_compile_error().into())
29}
30
31#[proc_macro_derive(DbBmc, attributes(db_bmc))]
32pub fn db_bmc(item: TokenStream) -> TokenStream {
33 let input = parse_macro_input!(item as syn::DeriveInput);
34 db_bmc::db_bmc_impl(&input).unwrap_or_else(|e| e.to_compile_error().into())
35}
36
37#[proc_macro_attribute]
38pub fn uuid_id(attr_args: TokenStream, item: TokenStream) -> TokenStream {
39 let attr_args = match NestedMeta::parse_meta_list(attr_args.into()) {
40 Ok(v) => v,
41 Err(e) => return TokenStream::from(darling::Error::from(e).write_errors()),
42 };
43
44 let args = match uuid_id::UuidArgs::from_list(&attr_args) {
45 Ok(v) => v,
46 Err(e) => return TokenStream::from(e.write_errors()),
47 };
48
49 let input = syn::parse_macro_input!(item as syn::ItemStruct);
50
51 uuid_id::uuid_id_impl(args, input).unwrap_or_else(|e| e.to_compile_error().into())
52}
53
54#[proc_macro_attribute]
55pub fn store_enum(attr_args: TokenStream, item: TokenStream) -> TokenStream {
56 let attr_args = match NestedMeta::parse_meta_list(attr_args.into()) {
57 Ok(v) => v,
58 Err(e) => return TokenStream::from(darling::Error::from(e).write_errors()),
59 };
60
61 let args = match store_enum::StoreEnumArgs::from_list(&attr_args) {
62 Ok(v) => v,
63 Err(e) => return TokenStream::from(e.write_errors()),
64 };
65
66 let input = syn::parse_macro_input!(item as syn::ItemEnum);
67
68 store_enum::store_enum_impl(args, input).unwrap_or_else(|e| e.to_compile_error().into())
69}