#![crate_type = "proc-macro"]
#![recursion_limit = "1024"]
#![deny(warnings, missing_copy_implementations)]
#![allow(clippy::needless_pass_by_value, clippy::option_map_unwrap_or_else, clippy::option_map_unwrap_or)]
#![warn(
clippy::wrong_pub_self_convention,
clippy::mut_mut,
clippy::non_ascii_literal,
clippy::similar_names,
clippy::unicode_not_nfc,
clippy::if_not_else,
clippy::items_after_statements,
clippy::used_underscore_binding
)]
#[macro_use]
extern crate darling;
extern crate proc_macro;
extern crate proc_macro2;
#[macro_use]
extern crate quote;
#[macro_use]
extern crate syn;
use darling::FromDeriveInput;
mod crud;
mod field;
mod macros;
mod opts;
mod utils;
mod view;
#[doc(hidden)]
#[proc_macro_derive(Creatable, attributes(crud))]
pub fn derive_crud_creatable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
let builder = crud::create::parse(opt, table_name);
quote!(#builder).into()
}
#[doc(hidden)]
#[proc_macro_derive(Updatable, attributes(crud))]
pub fn derive_crud_updatable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
let builder = crud::update::parse(opt, table_name);
quote!(#builder).into()
}
#[doc(hidden)]
#[proc_macro_derive(Deletable, attributes(crud))]
pub fn derive_crud_deletable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
let builder = crud::delete::parse(opt, table_name);
quote!(#builder).into()
}
#[doc(hidden)]
#[proc_macro_derive(Retrievable, attributes(crud))]
pub fn derive_crud_retrievable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
let builder = crud::retrieve::parse(opt);
quote!(#builder).into()
}
#[doc(hidden)]
#[proc_macro_derive(SimpleListable, attributes(crud))]
pub fn derive_crud_simple_listable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) error");
let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
let builder = crud::simple_list::parse(opt, table_name);
quote!(#builder).into()
}
#[proc_macro_derive(AddtionalCountModel, attributes(crud))]
pub fn model_crud_additional_count_model(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::ModelStructOpts::from_derive_input(&ast) error");
let table_name = utils::get_struct_attribute(&ast.attrs, "table_name").expect("table_name attribute not found!");
let builder = crud::additional_count_model::parse(opt, table_name);
quote!(#builder).into()
}
#[doc(hidden)]
#[proc_macro_derive(VDeletable, attributes(view))]
pub fn derive_view_delete(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ViewStructOpts::from_derive_input(&ast).expect("opts::ViewStructOpts::from_derive_input(&ast) error");
let builder = view::delete::parse(opt);
quote!(#builder).into()
}
#[proc_macro_derive(VCreatable, attributes(view))]
pub fn derive_view_create(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ViewStructOpts::from_derive_input(&ast).expect("opts::ViewStructOpts::from_derive_input(&ast) error");
let builder = view::create::parse(opt);
quote!(#builder).into()
}
#[doc(hidden)]
#[proc_macro_derive(VUpdatable, attributes(view))]
pub fn derive_view_update(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ViewStructOpts::from_derive_input(&ast).expect("opts::ViewStructOpts::from_derive_input(&ast) error");
let builder = view::update::parse(opt);
quote!(#builder).into()
}
#[doc(hidden)]
#[proc_macro_derive(VRetrievable, attributes(view))]
pub fn derive_view_query(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ViewStructOpts::from_derive_input(&ast).expect("opts::ViewStructOpts::from_derive_input(&ast) error");
let builder = view::retrieve::parse(opt);
quote!(#builder).into()
}
#[proc_macro_attribute]
pub fn queryable_by_name(_args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
let opt = opts::ModelStructOpts::from_derive_input(&ast).expect("opts::opts::ModelStructOpts::from_derive_input(&ast) diesel_queryable_by_name error");
let (add_count_field, generate_count_struct) = (false, false);
let builder = macros::diesel_queryable_by_name::parse(opt, add_count_field, generate_count_struct);
quote!(#builder).into()
}
#[proc_macro_attribute]
pub fn queryable_by_name_and_generate_count_model(_args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
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");
let (add_count_field, generate_count_struct) = (false, true);
let builder = macros::diesel_queryable_by_name::parse(opt, add_count_field, generate_count_struct);
quote!(#builder).into()
}
#[proc_macro_attribute]
pub fn queryable_by_name_and_add_count_field(_args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as syn::DeriveInput);
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");
let (add_count_field, generate_count_struct) = (true, false);
let builder = macros::diesel_queryable_by_name::parse(opt, add_count_field, generate_count_struct);
quote!(#builder).into()
}