diesel_crud_codegen/
lib.rs1#![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}