use crate::{Columns, Parameterized, PgParams, Sql, Term};
#[derive(Clone)]
pub struct Delete<'a> {
pub table: &'a str,
pub where_clause: Option<Term<'a>>,
pub returning: Option<Columns<'a>>,
}
impl<'a> Sql for Delete<'a> {
fn sql(&self) -> String {
let mut result = format!("DELETE FROM {}", self.table);
if let Some(conditions) = &self.where_clause {
result.push_str(&format!(" WHERE {}", conditions.sql()));
}
if let Some(returning) = &self.returning {
result.push_str(&format!(" RETURNING {}", returning.sql()));
}
result
}
}
pub struct DeleteBuilder<'a> {
table: &'a str,
where_clause: Option<Term<'a>>,
returning: Option<Columns<'a>>,
params: PgParams,
}
impl<'a> DeleteBuilder<'a> {
pub fn build(&self) -> Delete<'a> {
Delete {
table: self.table,
where_clause: self.where_clause.clone(),
returning: self.returning.clone(),
}
}
pub fn where_(&'a mut self, term: Term<'a>) -> &'a mut DeleteBuilder<'a> {
self.where_clause = Some(term);
self
}
pub fn returning(&'a mut self, columns: Columns<'a>) -> &'a mut DeleteBuilder<'a> {
self.returning = Some(columns);
self
}
}
impl<'a> Parameterized for DeleteBuilder<'a> {
fn param(&mut self) -> String {
self.params.seq()
}
}
#[allow(non_snake_case)]
pub fn D<'a>(table: &'a str) -> DeleteBuilder<'a> {
DeleteBuilder {
table,
where_clause: None,
returning: None,
params: PgParams::new(),
}
}