#![deny(clippy::all)] #![deny(clippy::pedantic)] #![deny(clippy::nursery)] #![allow(clippy::module_name_repetitions)] #![allow(clippy::unused_async)] #![allow(clippy::useless_let_if_seq)] // Reason: prevents some OpenApi structs from compiling #![forbid(unsafe_code)] //! Create ``SQLx`` CRUD code for a struct in Postgres. //! //! This crate provides the trait implementation `Crud` which //! generates the following ``SQLx`` queries: //! - find an entity by id //! //! SQL query: `SELECT * FROM ... WHERE = ...` //! - insert an entity into the database //! //! SQL query: `INSERT INTO ... (...) VALUES (...) RETURNING *` //! - update an entity in the database //! //! SQL query: `UPDATE ... SET ... WHERE = ... RETURNING *` //! - delete an entity from the database using its id //! //! SQL query: `DELETE FROM ... WHERE = ...` //! - update an entity or create it if it does not already exist in //! - the database //! //! This macro relies on the trait `Crud` found in the `gejdr-core` //! crate. //! //! To use this macro, you need to add it to the derives of the //! struct. You will also need to define its identifier //! //! # Usage //! //! Add `#[crud(table = "my_table_name")]` atop of the structure, //! after the `Crud` derive. You will also need to add `#[crud(id)]` //! atop of the field of your struct that will be used as the //! identifier of your entity. //! //! ```ignore //! #[derive(Crud)] //! #[crud(table = "users")] //! pub struct User { //! #[crud(id)] //! id: String, //! username: String, //! created_at: Timestampz, //! last_updated: Timestampz, //! } //! ``` //! //! With the example of the `User` struct, this links it to the //! `users` table of the connected database. It will use `Users.id` to //! uniquely identify a user entity. //! //! # Limitations //! ## ID //! For now, only one identifier is supported. It does not have to be //! a primary key, but it is strongly encouraged to use GeJDR’s Crud //! ID on a unique and non-null column of your database schema. //! //! ## Database type //! //! For now, only the ``PostgreSQL`` syntax is supported. If you use //! another database that uses the same syntax, you’re in luck! //! Otherwise, pull requests to add additional syntaxes are most //! welcome. mod crud; use crud::crud_derive_macro2; /// Generates CRUD code for Sqlx for a struct. /// /// # Panics /// /// May panic if errors arise while parsing and generating code. #[proc_macro_derive(Crud, attributes(crud))] pub fn crud_derive_macro(item: proc_macro::TokenStream) -> proc_macro::TokenStream { crud_derive_macro2(item.into()).unwrap().into() }