use crate::values::PostgresValue;
use drizzle_core::ToSQL;
use std::fmt::Debug;
use std::marker::PhantomData;
use super::ExecutableState;
#[derive(Debug, Clone, Copy, Default)]
pub struct DeleteInitial;
#[derive(Debug, Clone, Copy, Default)]
pub struct DeleteWhereSet;
#[derive(Debug, Clone, Copy, Default)]
pub struct DeleteReturningSet;
impl ExecutableState for DeleteInitial {}
impl ExecutableState for DeleteWhereSet {}
impl ExecutableState for DeleteReturningSet {}
pub type DeleteBuilder<'a, Schema, State, Table> = super::QueryBuilder<'a, Schema, State, Table>;
impl<'a, S, T> DeleteBuilder<'a, S, DeleteInitial, T> {
#[inline]
pub fn r#where(
self,
condition: impl ToSQL<'a, PostgresValue<'a>>,
) -> DeleteBuilder<'a, S, DeleteWhereSet, T> {
let where_sql = crate::helpers::r#where(condition.to_sql());
DeleteBuilder {
sql: self.sql.append(where_sql),
schema: PhantomData,
state: PhantomData,
table: PhantomData,
}
}
#[inline]
pub fn returning(
self,
columns: impl ToSQL<'a, PostgresValue<'a>>,
) -> DeleteBuilder<'a, S, DeleteReturningSet, T> {
let returning_sql = crate::helpers::returning(columns);
DeleteBuilder {
sql: self.sql.append(returning_sql),
schema: PhantomData,
state: PhantomData,
table: PhantomData,
}
}
}
impl<'a, S, T> DeleteBuilder<'a, S, DeleteWhereSet, T> {
#[inline]
pub fn returning(
self,
columns: impl ToSQL<'a, PostgresValue<'a>>,
) -> DeleteBuilder<'a, S, DeleteReturningSet, T> {
let returning_sql = crate::helpers::returning(columns);
DeleteBuilder {
sql: self.sql.append(returning_sql),
schema: PhantomData,
state: PhantomData,
table: PhantomData,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use drizzle_core::{SQL, ToSQL};
#[test]
fn test_delete_builder_creation() {
let builder = DeleteBuilder::<(), DeleteInitial, ()> {
sql: SQL::raw("DELETE FROM test"),
schema: PhantomData,
state: PhantomData,
table: PhantomData,
};
assert_eq!(builder.to_sql().sql(), "DELETE FROM test");
}
}