bodega_macros/
lib.rs

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}