use std::rc::Rc;
use crate::{ColumnDef, backend::TableBuilder, types::*, prepare::*};
#[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>),
}
#[derive(Debug, Clone)]
pub enum TablePartitionOption {
}
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
}
pub fn build<T: TableBuilder>(&self, table_builder: T) -> String {
let mut sql = SqlWriter::new();
table_builder.prepare_table_alter_statement(self, &mut sql);
sql.result()
}
pub fn build_any(&self, table_builder: &dyn TableBuilder) -> String {
let mut sql = SqlWriter::new();
table_builder.prepare_table_alter_statement(self, &mut sql);
sql.result()
}
pub fn to_string<T: TableBuilder>(&self, table_builder: T) -> String {
self.build(table_builder)
}
}