generated from phundrak/rust-poem-openapi-template
82 lines
2.6 KiB
Rust
82 lines
2.6 KiB
Rust
#![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 <id> = ...`
|
||
//! - insert an entity into the database
|
||
//!
|
||
//! SQL query: `INSERT INTO ... (...) VALUES (...) RETURNING *`
|
||
//! - update an entity in the database
|
||
//!
|
||
//! SQL query: `UPDATE ... SET ... WHERE <id> = ... RETURNING *`
|
||
//! - delete an entity from the database using its id
|
||
//!
|
||
//! SQL query: `DELETE FROM ... WHERE <id> = ...`
|
||
//! - 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()
|
||
}
|