use turso_sql::{ColumnRef, ColumnType, Expr, Value};
use super::iden::{IdenStatic, Iterable};
#[derive(Clone, Debug, PartialEq)]
pub struct ColumnDef {
pub ty: ColumnType,
pub nullable: bool,
pub unique: bool,
pub indexed: bool,
pub default: Option<Expr>,
}
impl ColumnDef {
pub const fn new(ty: ColumnType) -> Self {
Self {
ty,
nullable: false,
unique: false,
indexed: false,
default: None,
}
}
#[must_use]
pub fn nullable(mut self, nullable: bool) -> Self {
self.nullable = nullable;
self
}
#[must_use]
pub fn unique(mut self) -> Self {
self.unique = true;
self
}
#[must_use]
pub fn indexed(mut self) -> Self {
self.indexed = true;
self
}
#[must_use]
pub fn default(mut self, value: impl Into<Expr>) -> Self {
self.default = Some(value.into());
self
}
}
pub trait ColumnTrait: IdenStatic + Iterable {
const TABLE: &'static str;
fn def(&self) -> ColumnDef;
fn as_column_ref(&self) -> ColumnRef {
ColumnRef::TableColumn(Self::TABLE.into(), self.as_str().into())
}
fn into_expr(self) -> Expr {
Expr::Column(self.as_column_ref())
}
fn eq<V: Into<Value>>(&self, v: V) -> Expr {
self.into_expr().eq(Expr::val(v))
}
fn ne<V: Into<Value>>(&self, v: V) -> Expr {
self.into_expr().ne(Expr::val(v))
}
fn gt<V: Into<Value>>(&self, v: V) -> Expr {
self.into_expr().gt(Expr::val(v))
}
fn gte<V: Into<Value>>(&self, v: V) -> Expr {
self.into_expr().gte(Expr::val(v))
}
fn lt<V: Into<Value>>(&self, v: V) -> Expr {
self.into_expr().lt(Expr::val(v))
}
fn lte<V: Into<Value>>(&self, v: V) -> Expr {
self.into_expr().lte(Expr::val(v))
}
fn between<V: Into<Value>>(&self, a: V, b: V) -> Expr {
self.into_expr().between(Expr::val(a), Expr::val(b))
}
fn not_between<V: Into<Value>>(&self, a: V, b: V) -> Expr {
self.into_expr().not_between(Expr::val(a), Expr::val(b))
}
fn like(&self, pattern: &str) -> Expr {
self.into_expr().like(pattern)
}
fn not_like(&self, pattern: &str) -> Expr {
self.into_expr().not_like(pattern)
}
fn starts_with(&self, s: &str) -> Expr {
self.into_expr().starts_with(s)
}
fn ends_with(&self, s: &str) -> Expr {
self.into_expr().ends_with(s)
}
fn contains(&self, s: &str) -> Expr {
self.into_expr().contains(s)
}
fn is_null(&self) -> Expr {
self.into_expr().is_null()
}
fn is_not_null(&self) -> Expr {
self.into_expr().is_not_null()
}
fn is_in<V: Into<Value>, I: IntoIterator<Item = V>>(&self, values: I) -> Expr {
self.into_expr().is_in(values)
}
fn is_not_in<V: Into<Value>, I: IntoIterator<Item = V>>(&self, values: I) -> Expr {
self.into_expr().is_not_in(values)
}
fn in_subquery(&self, select: turso_sql::Select) -> Expr {
self.into_expr().in_subquery(select)
}
fn not_in_subquery(&self, select: turso_sql::Select) -> Expr {
self.into_expr().not_in_subquery(select)
}
fn eq_col<C: ColumnTrait>(&self, other: C) -> Expr {
self.into_expr().eq(other.into_expr())
}
fn matches(&self, query: &str) -> Expr {
self.into_expr().matches(query)
}
fn if_null<V: Into<Value>>(&self, v: V) -> Expr {
turso_sql::Func::if_null(self.into_expr(), Expr::val(v))
}
fn max(&self) -> Expr {
turso_sql::Func::max(self.into_expr())
}
fn min(&self) -> Expr {
turso_sql::Func::min(self.into_expr())
}
fn sum(&self) -> Expr {
turso_sql::Func::sum(self.into_expr())
}
fn count(&self) -> Expr {
turso_sql::Func::count(self.into_expr())
}
fn avg(&self) -> Expr {
turso_sql::Func::avg(self.into_expr())
}
}