1#![allow(dead_code)]
2#![forbid(unsafe_code)]
3#![deny(missing_docs)]
4#![doc = include_str!("../README.md")]
5#![doc(
6 html_logo_url = "https://raw.githubusercontent.com/42ByteLabs/geekorm/main/assets/geekorm.png"
7)]
8
9pub mod backends;
10pub mod builder;
11pub mod error;
12#[cfg(feature = "migrations")]
13pub mod migrations;
14pub mod queries;
15pub mod utils;
16
17pub use crate::backends::{GeekConnection, GeekConnector};
18#[cfg(feature = "migrations")]
19pub use crate::builder::alter::AlterQuery;
20pub use crate::builder::columns::{Column, Columns};
21pub use crate::builder::columntypes::{ColumnType, ColumnTypeOptions};
22pub use crate::builder::database::Database;
23pub use crate::builder::keys::{ForeignKey, PrimaryKey};
24pub use crate::builder::table::Table;
25pub use crate::builder::values::{Value, Values};
26pub use crate::error::Error;
27#[cfg(feature = "pagination")]
28pub use crate::queries::pages::Page;
29#[cfg(feature = "pagination")]
30pub use crate::queries::pagination::Pagination;
31pub use crate::queries::{Query, QueryBuilder};
32#[cfg(feature = "two-factor-auth")]
33pub use crate::utils::tfa::TwoFactorAuth;
34#[cfg(feature = "libsql")]
35pub use backends::libsql;
36#[cfg(feature = "migrations")]
37pub use migrations::Migration;
38
39pub trait TableBuilder
44where
45 Self: Sized,
46{
47 fn table() -> Table;
49
50 fn get_table(&self) -> Table;
52
53 fn table_name() -> String;
55}
56
57pub trait QueryBuilderTrait
59where
60 Self: TableBuilder + Sized,
61{
62 fn query_create() -> QueryBuilder;
64
65 fn query_select() -> QueryBuilder {
67 QueryBuilder::select()
68 }
69
70 fn query_all() -> Query {
72 Self::query_select()
73 .table(Self::table())
74 .build()
75 .expect("Failed to build SELECT ALL query")
76 }
77
78 fn query_insert(item: &Self) -> Query;
80
81 fn query_update(item: &Self) -> Query;
83
84 fn query_delete(item: &Self) -> Query;
86
87 fn query_count() -> QueryBuilder;
89}
90
91pub trait TablePrimaryKey
94where
95 Self: TableBuilder + QueryBuilderTrait + Sized,
96{
97 fn primary_key() -> String;
99
100 fn primary_key_value(&self) -> Value;
102
103 fn query_select_by_primary_key(pk: impl Into<Value>) -> Query {
105 Self::query_select()
106 .table(Self::table())
107 .where_eq(&Self::primary_key(), pk)
108 .build()
109 .expect("Failed to build SELECT BY PRIMARY KEY query")
110 }
111}
112
113pub trait ToSqlite {
117 fn to_sqlite(&self) -> String {
119 String::new()
120 }
121
122 #[allow(unused_variables)]
124 fn on_create(&self, query: &QueryBuilder) -> Result<String, Error> {
125 Ok(String::new())
126 }
127
128 fn on_select(&self, query: &QueryBuilder) -> Result<String, Error> {
130 Err(Error::QueryBuilderError(
131 format!("on_select not implemented for table: {}", query.table),
132 String::from("on_select"),
133 ))
134 }
135
136 fn on_insert(&self, query: &QueryBuilder) -> Result<(String, Values), Error> {
138 Err(Error::QueryBuilderError(
139 format!("on_insert not implemented for table: {}", query.table),
140 String::from("on_insert"),
141 ))
142 }
143
144 fn on_update(&self, query: &QueryBuilder) -> Result<(String, Values), Error> {
146 Err(Error::QueryBuilderError(
147 format!("on_update not implemented for table: {}", query.table),
148 String::from("on_update"),
149 ))
150 }
151
152 fn on_delete(&self, query: &QueryBuilder) -> Result<(String, Values), Error> {
154 Err(Error::QueryBuilderError(
155 format!("on_delete not implemented for table: {}", query.table),
156 String::from("on_delete"),
157 ))
158 }
159
160 #[allow(unused_variables)]
162 #[cfg(feature = "migrations")]
163 fn on_alter(&self, query: &AlterQuery) -> Result<String, crate::Error> {
164 Err(Error::QueryBuilderError(
165 "on_alter not implemented for table".to_string(),
166 String::from("on_alter"),
167 ))
168 }
169}