es_entity/
lib.rs

1//! A Rust library for persisting Event Sourced entities to PostgreSQL
2//!
3//! This crate simplifies Event Sourcing persistence by automatically generating type-safe
4//! queries and operations for PostgreSQL. It decouples domain logic from persistence
5//! concerns while ensuring compile-time verification through [`sqlx`](https://crates.io/crates/sqlx).
6//!
7//! # Documentation
8//! - [Book](https://galoymoney.github.io/es-entity)
9//! - [Github repository](https://github.com/GaloyMoney/es-entity)
10//! - [Cargo package](https://crates.io/crates/es-entity)
11//!
12//! # Features
13//!
14//! - Store and construct from event sequences
15//! - Type-safe and compile-time verification
16//! - Simple and configurable query generation
17//! - Easy idempotency checks
18//! - Cursor-based pagination
19//! - Flexible ID types
20//! - Atomic operations
21//! - Reduce boilerplate code
22
23#![cfg_attr(feature = "fail-on-warnings", deny(warnings))]
24#![cfg_attr(feature = "fail-on-warnings", deny(clippy::all))]
25
26pub mod error;
27pub mod events;
28pub mod idempotent;
29mod macros;
30pub mod nested;
31pub mod one_time_executor;
32pub mod operation;
33pub mod pagination;
34pub mod query;
35pub mod traits;
36
37pub mod prelude {
38    //! Convenience re-export of crates that the derive macros reference in generated code.
39
40    pub use chrono;
41    pub use serde;
42    pub use serde_json;
43    pub use sqlx;
44    pub use uuid;
45
46    #[cfg(feature = "json-schema")]
47    pub use schemars;
48}
49
50#[doc(inline)]
51pub use error::*;
52pub use es_entity_macros::EsEntity;
53pub use es_entity_macros::EsEvent;
54pub use es_entity_macros::EsRepo;
55pub use es_entity_macros::expand_es_query;
56pub use es_entity_macros::retry_on_concurrent_modification;
57#[doc(inline)]
58pub use events::*;
59#[doc(inline)]
60pub use idempotent::*;
61#[doc(inline)]
62pub use nested::*;
63#[doc(inline)]
64pub use one_time_executor::*;
65#[doc(inline)]
66pub use operation::*;
67#[doc(inline)]
68pub use pagination::*;
69#[doc(inline)]
70pub use query::*;
71#[doc(inline)]
72pub use traits::*;
73
74#[cfg(feature = "graphql")]
75pub mod graphql {
76    pub use async_graphql;
77    pub use base64;
78
79    #[derive(Debug, serde::Serialize, serde::Deserialize, Clone, Copy)]
80    #[serde(transparent)]
81    pub struct UUID(crate::prelude::uuid::Uuid);
82    async_graphql::scalar!(UUID);
83    impl<T: Into<crate::prelude::uuid::Uuid>> From<T> for UUID {
84        fn from(id: T) -> Self {
85            let uuid = id.into();
86            Self(uuid)
87        }
88    }
89    impl From<&UUID> for crate::prelude::uuid::Uuid {
90        fn from(id: &UUID) -> Self {
91            id.0
92        }
93    }
94}