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