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}