sqlxo/
lib.rs

1#![feature(trait_alias)]
2#![forbid(unsafe_code)]
3#![feature(specialization)]
4#![allow(incomplete_features)]
5extern crate self as sqlxo;
6
7pub use sqlxo_macros::*;
8pub use sqlxo_traits::*;
9
10pub mod prelude {
11	pub use super::{
12		Filterable,
13		JoinKind,
14		Query,
15		QueryContext,
16		Sortable,
17		SqlJoin,
18		WebQuery,
19	};
20}
21
22pub mod blocks;
23pub mod web;
24
25mod delete;
26mod insert;
27mod read;
28mod update;
29pub use delete::{
30	DeleteQueryBuilder,
31	DeleteQueryPlan,
32};
33pub use insert::{
34	InsertQueryBuilder,
35	InsertQueryPlan,
36};
37pub use read::{
38	ReadQueryBuilder,
39	ReadQueryPlan,
40};
41pub use update::{
42	UpdateQueryBuilder,
43	UpdateQueryPlan,
44};
45
46use sqlx::{
47	Executor,
48	Postgres,
49};
50
51pub struct QueryBuilder<C> {
52	_phantom: std::marker::PhantomData<C>,
53}
54
55impl<'a, C> QueryBuilder<C>
56where
57	C: QueryContext,
58{
59	pub fn read() -> ReadQueryBuilder<'a, C> {
60		ReadQueryBuilder::from_ctx()
61	}
62
63	pub fn delete() -> DeleteQueryBuilder<'a, C>
64	where
65		C::Model: crate::Deletable,
66	{
67		DeleteQueryBuilder::from_ctx()
68	}
69
70	pub fn update() -> UpdateQueryBuilder<'a, C>
71	where
72		C::Model: crate::Updatable,
73	{
74		UpdateQueryBuilder::from_ctx()
75	}
76
77	pub fn insert() -> InsertQueryBuilder<'a, C>
78	where
79		C::Model: crate::Creatable,
80	{
81		InsertQueryBuilder::from_ctx()
82	}
83}
84
85#[async_trait::async_trait]
86pub trait ExecutablePlan<C: QueryContext> {
87	async fn execute<'e, E>(&self, exec: E) -> Result<u64, sqlx::Error>
88	where
89		E: Executor<'e, Database = Postgres>;
90}
91
92#[async_trait::async_trait]
93pub trait FetchablePlan<C: QueryContext> {
94	async fn fetch_one<'e, E>(&self, exec: E) -> Result<C::Model, sqlx::Error>
95	where
96		E: Executor<'e, Database = Postgres>;
97
98	async fn fetch_all<'e, E>(
99		&self,
100		exec: E,
101	) -> Result<Vec<C::Model>, sqlx::Error>
102	where
103		E: Executor<'e, Database = Postgres>;
104
105	async fn fetch_optional<'e, E>(
106		&self,
107		exec: E,
108	) -> Result<Option<C::Model>, sqlx::Error>
109	where
110		E: Executor<'e, Database = Postgres>;
111}
112
113pub trait Planable<C>: ExecutablePlan<C> + FetchablePlan<C>
114where
115	C: QueryContext,
116{
117}
118
119pub trait Buildable<C: QueryContext> {
120	type Plan: Planable<C>;
121
122	fn from_ctx() -> Self;
123	fn build(self) -> Self::Plan;
124}