diesel_crud_codegen/
lib.rs

1#![crate_type = "proc-macro"]
2#![recursion_limit = "1024"]
3#![deny(warnings, missing_copy_implementations)]
4#![allow(clippy::needless_pass_by_value, clippy::option_map_unwrap_or_else, clippy::option_map_unwrap_or)]
5#![warn(
6    clippy::wrong_pub_self_convention,
7    clippy::mut_mut,
8    clippy::non_ascii_literal,
9    clippy::similar_names,
10    clippy::unicode_not_nfc,
11    clippy::if_not_else,
12    clippy::items_after_statements,
13    clippy::used_underscore_binding
14)]
15
16#[macro_use]
17extern crate darling;
18extern crate proc_macro;
19extern crate proc_macro2;
20#[macro_use]
21extern crate quote;
22#[macro_use]
23extern crate syn;
24
25use darling::FromDeriveInput;
26
27mod crud;
28mod field;
29mod macros;
30mod opts;
31mod utils;
32mod view;
33
34#[doc(hidden)]
35#[proc_macro_derive(Creatable, attributes(crud))]
36pub fn derive_crud_creatable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
37    let ast = parse_macro_input!(input as syn::DeriveInput);
38    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
39    let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
40    let builder = crud::create::parse(opt, table_name);
41    quote!(#builder).into()
42}
43
44#[doc(hidden)]
45#[proc_macro_derive(Updatable, attributes(crud))]
46pub fn derive_crud_updatable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
47    let ast = parse_macro_input!(input as syn::DeriveInput);
48    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
49    let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
50    let builder = crud::update::parse(opt, table_name);
51    quote!(#builder).into()
52}
53
54#[doc(hidden)]
55#[proc_macro_derive(Deletable, attributes(crud))]
56pub fn derive_crud_deletable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
57    let ast = parse_macro_input!(input as syn::DeriveInput);
58    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
59    let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
60    let builder = crud::delete::parse(opt, table_name);
61    quote!(#builder).into()
62}
63
64#[doc(hidden)]
65#[proc_macro_derive(Retrievable, attributes(crud))]
66pub fn derive_crud_retrievable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
67    let ast = parse_macro_input!(input as syn::DeriveInput);
68    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
69    let builder = crud::retrieve::parse(opt);
70    quote!(#builder).into()
71}
72
73#[doc(hidden)]
74#[proc_macro_derive(SimpleListable, attributes(crud))]
75pub fn derive_crud_simple_listable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
76    let ast = parse_macro_input!(input as syn::DeriveInput);
77    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
78    let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
79    let builder = crud::simple_list::parse(opt, table_name);
80    quote!(#builder).into()
81}
82
83#[proc_macro_derive(AddtionalCountModel, attributes(crud))]
84pub fn model_crud_additional_count_model(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
85    let ast = parse_macro_input!(input as syn::DeriveInput);
86    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::ModelStructOpts::from_derive_input(&ast) error");
87    let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
88    let builder = crud::additional_count_model::parse(opt, table_name);
89    quote!(#builder).into()
90}
91
92#[doc(hidden)]
93#[proc_macro_derive(VDeletable, attributes(view))]
94pub fn derive_view_delete(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
95    let ast = parse_macro_input!(input as syn::DeriveInput);
96    let opt = opts::ViewStructOpts::from_derive_input(&ast).expect("opts::ViewStructOpts::from_derive_input(&ast) error");
97    let builder = view::delete::parse(opt);
98    quote!(#builder).into()
99}
100
101#[proc_macro_derive(VCreatable, attributes(view))]
102pub fn derive_view_create(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
103    let ast = parse_macro_input!(input as syn::DeriveInput);
104    let opt = opts::ViewStructOpts::from_derive_input(&ast).expect("opts::ViewStructOpts::from_derive_input(&ast) error");
105    let builder = view::create::parse(opt);
106    quote!(#builder).into()
107}
108
109#[doc(hidden)]
110#[proc_macro_derive(VUpdatable, attributes(view))]
111pub fn derive_view_update(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
112    let ast = parse_macro_input!(input as syn::DeriveInput);
113    let opt = opts::ViewStructOpts::from_derive_input(&ast).expect("opts::ViewStructOpts::from_derive_input(&ast) error");
114    let builder = view::update::parse(opt);
115    quote!(#builder).into()
116}
117
118#[doc(hidden)]
119#[proc_macro_derive(VRetrievable, attributes(view))]
120pub fn derive_view_query(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
121    let ast = parse_macro_input!(input as syn::DeriveInput);
122    let opt = opts::ViewStructOpts::from_derive_input(&ast).expect("opts::ViewStructOpts::from_derive_input(&ast) error");
123    let builder = view::retrieve::parse(opt);
124    quote!(#builder).into()
125}
126
127#[proc_macro_attribute]
128pub fn queryable_by_name(_args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
129    let ast = parse_macro_input!(input as syn::DeriveInput);
130    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) diesel_queryable_by_name error");
131    let (add_count_field, generate_count_struct) = (false, false);
132    let builder = macros::diesel_queryable_by_name::parse(opt, add_count_field, generate_count_struct);
133    quote!(#builder).into()
134}
135
136#[proc_macro_attribute]
137pub fn queryable_by_name_and_generate_count_model(_args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
138    let ast = parse_macro_input!(input as syn::DeriveInput);
139    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) diesel_queryable_by_name_and_generate_count_model error");
140    let (add_count_field, generate_count_struct) = (false, true);
141    let builder = macros::diesel_queryable_by_name::parse(opt, add_count_field, generate_count_struct);
142    quote!(#builder).into()
143}
144
145#[proc_macro_attribute]
146pub fn queryable_by_name_and_add_count_field(_args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
147    let ast = parse_macro_input!(input as syn::DeriveInput);
148    let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) diesel_queryable_by_name_and_generate_count_model error");
149    let (add_count_field, generate_count_struct) = (true, false);
150    let builder = macros::diesel_queryable_by_name::parse(opt, add_count_field, generate_count_struct);
151    quote!(#builder).into()
152}