feat: rename crates from gejdr-crud to georm

This commit renames gejdr-crud to georm for an easier name to remember
in case I publish `georm` and `georm-macros`. This commit extracts the
`Georm` (formerly `Crud`) trait from `gejdr-core` to its dedicated
crate `georm` on which gejdr-core now depends.

Currently writing tests
This commit is contained in:
2025-01-25 23:41:44 +01:00
parent 915bd8387e
commit 857b1d98d0
19 changed files with 285 additions and 180 deletions

22
georm/Cargo.toml Normal file
View File

@@ -0,0 +1,22 @@
[package]
name = "georm"
version = "0.1.0"
edition = "2021"
authors = ["Lucien Cartier-Tilet <lucien@phundrak.com>"]
description = "A small, opiniated ORM for SQLx and PostgreSQL"
homepage = "https://labs.phundrak.com/phundrak/gejdr-rs"
repository = "https://labs.phundrak.com/phundrak/gejdr-rs"
license = "MIT OR GPL-3.0-or-later"
keywords = ["sqlx", "orm", "postgres", "postgresql", "database", "async"]
categories = ["database"]
[dependencies]
georm-macros = { path = "../georm-macros" }
[dependencies.sqlx]
version = "0.8.3"
default-features = false
features = ["postgres", "runtime-tokio", "macros", "migrate"]
[lints.rust]
unsafe_code = "forbid"

1
georm/README.md Normal file
View File

@@ -0,0 +1 @@
# A small, opiniated ORM for SQLx with PostgreSQL

82
georm/src/lib.rs Normal file
View File

@@ -0,0 +1,82 @@
#![deny(clippy::all)]
#![deny(clippy::pedantic)]
#![deny(clippy::nursery)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::unused_async)]
#![forbid(unsafe_code)]
pub use georm_macros::Georm;
pub trait Georm<Id> {
/// Find the entiy in the database based on its identifier.
///
/// # Errors
/// Returns any error Postgres may have encountered
fn find(
pool: &sqlx::PgPool,
id: &Id,
) -> impl std::future::Future<Output = sqlx::Result<Option<Self>>> + Send
where
Self: Sized;
/// Create the entity in the database.
///
/// # Errors
/// Returns any error Postgres may have encountered
fn create(
&self,
pool: &sqlx::PgPool,
) -> impl std::future::Future<Output = sqlx::Result<Self>> + Send
where
Self: Sized;
/// Update an entity with a matching identifier in the database.
///
/// # Errors
/// Returns any error Postgres may have encountered
fn update(
&self,
pool: &sqlx::PgPool,
) -> impl std::future::Future<Output = sqlx::Result<Self>> + Send
where
Self: Sized;
/// Update an entity with a matching identifier in the database if
/// it exists, create it otherwise.
///
/// # Errors
/// Returns any error Postgres may have encountered
fn create_or_update(
&self,
pool: &sqlx::PgPool,
) -> impl std::future::Future<Output = sqlx::Result<Self>> + Send
where
Self: Sized;
/// Delete the entity from the database if it exists.
///
/// # Returns
/// Returns the amount of rows affected by the deletion.
///
/// # Errors
/// Returns any error Postgres may have encountered
fn delete(
&self,
pool: &sqlx::PgPool,
) -> impl std::future::Future<Output = sqlx::Result<u64>> + Send;
/// Delete any entity with the identifier `id`.
///
/// # Returns
/// Returns the amount of rows affected by the deletion.
///
/// # Errors
/// Returns any error Postgres may have encountered
fn delete_by_id(
pool: &sqlx::PgPool,
id: &Id,
) -> impl std::future::Future<Output = sqlx::Result<u64>> + Send;
/// Returns the identifier of the entity.
fn get_id(&self) -> &Id;
}

View File

View File

@@ -0,0 +1,9 @@
use georm::Georm;
#[derive(Debug, Georm)]
#[georm(table = "tests.authors")]
struct Author {
#[georm(column = "author_id", id)]
id: i32,
name: String
}