turso_orm/entity/
column.rs1use turso_sql::{ColumnRef, ColumnType, Expr, Value};
17
18use super::iden::{IdenStatic, Iterable};
19
20#[derive(Clone, Debug, PartialEq)]
22pub struct ColumnDef {
23 pub ty: ColumnType,
25 pub nullable: bool,
27 pub unique: bool,
29 pub indexed: bool,
31 pub default: Option<Expr>,
33}
34
35impl ColumnDef {
36 pub const fn new(ty: ColumnType) -> Self {
38 Self {
39 ty,
40 nullable: false,
41 unique: false,
42 indexed: false,
43 default: None,
44 }
45 }
46
47 #[must_use]
49 pub fn nullable(mut self, nullable: bool) -> Self {
50 self.nullable = nullable;
51 self
52 }
53
54 #[must_use]
56 pub fn unique(mut self) -> Self {
57 self.unique = true;
58 self
59 }
60
61 #[must_use]
63 pub fn indexed(mut self) -> Self {
64 self.indexed = true;
65 self
66 }
67
68 #[must_use]
70 pub fn default(mut self, value: impl Into<Expr>) -> Self {
71 self.default = Some(value.into());
72 self
73 }
74}
75
76pub trait ColumnTrait: IdenStatic + Iterable {
82 const TABLE: &'static str;
84
85 fn def(&self) -> ColumnDef;
87
88 fn as_column_ref(&self) -> ColumnRef {
90 ColumnRef::TableColumn(Self::TABLE.into(), self.as_str().into())
91 }
92
93 fn into_expr(self) -> Expr {
95 Expr::Column(self.as_column_ref())
96 }
97
98 fn eq<V: Into<Value>>(&self, v: V) -> Expr {
100 self.into_expr().eq(Expr::val(v))
101 }
102
103 fn ne<V: Into<Value>>(&self, v: V) -> Expr {
105 self.into_expr().ne(Expr::val(v))
106 }
107
108 fn gt<V: Into<Value>>(&self, v: V) -> Expr {
110 self.into_expr().gt(Expr::val(v))
111 }
112
113 fn gte<V: Into<Value>>(&self, v: V) -> Expr {
115 self.into_expr().gte(Expr::val(v))
116 }
117
118 fn lt<V: Into<Value>>(&self, v: V) -> Expr {
120 self.into_expr().lt(Expr::val(v))
121 }
122
123 fn lte<V: Into<Value>>(&self, v: V) -> Expr {
125 self.into_expr().lte(Expr::val(v))
126 }
127
128 fn between<V: Into<Value>>(&self, a: V, b: V) -> Expr {
130 self.into_expr().between(Expr::val(a), Expr::val(b))
131 }
132
133 fn not_between<V: Into<Value>>(&self, a: V, b: V) -> Expr {
135 self.into_expr().not_between(Expr::val(a), Expr::val(b))
136 }
137
138 fn like(&self, pattern: &str) -> Expr {
140 self.into_expr().like(pattern)
141 }
142
143 fn not_like(&self, pattern: &str) -> Expr {
145 self.into_expr().not_like(pattern)
146 }
147
148 fn starts_with(&self, s: &str) -> Expr {
150 self.into_expr().starts_with(s)
151 }
152
153 fn ends_with(&self, s: &str) -> Expr {
155 self.into_expr().ends_with(s)
156 }
157
158 fn contains(&self, s: &str) -> Expr {
160 self.into_expr().contains(s)
161 }
162
163 fn is_null(&self) -> Expr {
165 self.into_expr().is_null()
166 }
167
168 fn is_not_null(&self) -> Expr {
170 self.into_expr().is_not_null()
171 }
172
173 fn is_in<V: Into<Value>, I: IntoIterator<Item = V>>(&self, values: I) -> Expr {
175 self.into_expr().is_in(values)
176 }
177
178 fn is_not_in<V: Into<Value>, I: IntoIterator<Item = V>>(&self, values: I) -> Expr {
180 self.into_expr().is_not_in(values)
181 }
182
183 fn in_subquery(&self, select: turso_sql::Select) -> Expr {
185 self.into_expr().in_subquery(select)
186 }
187
188 fn not_in_subquery(&self, select: turso_sql::Select) -> Expr {
190 self.into_expr().not_in_subquery(select)
191 }
192
193 fn eq_col<C: ColumnTrait>(&self, other: C) -> Expr {
196 self.into_expr().eq(other.into_expr())
197 }
198
199 fn matches(&self, query: &str) -> Expr {
201 self.into_expr().matches(query)
202 }
203
204 fn if_null<V: Into<Value>>(&self, v: V) -> Expr {
206 turso_sql::Func::if_null(self.into_expr(), Expr::val(v))
207 }
208
209 fn max(&self) -> Expr {
211 turso_sql::Func::max(self.into_expr())
212 }
213
214 fn min(&self) -> Expr {
216 turso_sql::Func::min(self.into_expr())
217 }
218
219 fn sum(&self) -> Expr {
221 turso_sql::Func::sum(self.into_expr())
222 }
223
224 fn count(&self) -> Expr {
226 turso_sql::Func::count(self.into_expr())
227 }
228
229 fn avg(&self) -> Expr {
231 turso_sql::Func::avg(self.into_expr())
232 }
233}