use crate::{backend::SchemaBuilder, prepare::*, types::*, ColumnDef, SchemaStatementBuilder};
use std::rc::Rc;
#[derive(Debug, Clone)]
pub struct TableAlterStatement {
pub(crate) table: Option<Rc<dyn Iden>>,
pub(crate) alter_option: Option<TableAlterOption>,
}
#[derive(Debug, Clone)]
pub enum TableAlterOption {
AddColumn(ColumnDef),
ModifyColumn(ColumnDef),
RenameColumn(Rc<dyn Iden>, Rc<dyn Iden>),
DropColumn(Rc<dyn Iden>),
}
impl Default for TableAlterStatement {
fn default() -> Self {
Self::new()
}
}
impl TableAlterStatement {
pub fn new() -> Self {
Self {
table: None,
alter_option: None,
}
}
pub fn table<T: 'static>(mut self, table: T) -> Self
where
T: Iden,
{
self.table = Some(Rc::new(table));
self
}
pub fn add_column(self, column_def: ColumnDef) -> Self {
self.alter_option(TableAlterOption::AddColumn(column_def))
}
pub fn modify_column(self, column_def: ColumnDef) -> Self {
self.alter_option(TableAlterOption::ModifyColumn(column_def))
}
pub fn rename_column<T: 'static, R: 'static>(self, from_name: T, to_name: R) -> Self
where
T: Iden,
R: Iden,
{
self.alter_option(TableAlterOption::RenameColumn(
Rc::new(from_name),
Rc::new(to_name),
))
}
pub fn drop_column<T: 'static>(self, col_name: T) -> Self
where
T: Iden,
{
self.alter_option(TableAlterOption::DropColumn(Rc::new(col_name)))
}
fn alter_option(mut self, alter_option: TableAlterOption) -> Self {
self.alter_option = Some(alter_option);
self
}
}
impl SchemaStatementBuilder for TableAlterStatement {
fn build<T: SchemaBuilder>(&self, schema_builder: T) -> String {
let mut sql = SqlWriter::new();
schema_builder.prepare_table_alter_statement(self, &mut sql);
sql.result()
}
fn build_any(&self, schema_builder: &dyn SchemaBuilder) -> String {
let mut sql = SqlWriter::new();
schema_builder.prepare_table_alter_statement(self, &mut sql);
sql.result()
}
}