use std::rc::Rc;
use crate::{types::*, value::*};
#[derive(Debug, Clone)]
pub struct ColumnDef {
pub(crate) table: Option<Rc<dyn Iden>>,
pub(crate) name: Rc<dyn Iden>,
pub(crate) types: Option<ColumnType>,
pub(crate) spec: Vec<ColumnSpec>,
}
impl ColumnDef {
pub fn new<T: 'static>(name: T) -> Self
where T: Iden{
Self {
table: None,
name: Rc::new(name),
types: None,
spec: Vec::new(),
}
}
pub fn not_null(mut self) -> Self {
self.spec.push(ColumnSpec::NotNull);
self
}
pub fn default<T>(mut self, value: T) -> Self
where T: Into<Value> {
self.spec.push(ColumnSpec::Default(value.into()));
self
}
pub fn auto_increment(mut self) -> Self {
self.spec.push(ColumnSpec::AutoIncrement);
self
}
pub fn unique_key(mut self) -> Self {
self.spec.push(ColumnSpec::UniqueKey);
self
}
pub fn primary_key(mut self) -> Self {
self.spec.push(ColumnSpec::PrimaryKey);
self
}
pub fn char_len(mut self, length: u32) -> Self {
self.types = Some(ColumnType::Char(Some(length)));
self
}
pub fn char(mut self) -> Self {
self.types = Some(ColumnType::Char(None));
self
}
pub fn string_len(mut self, length: u32) -> Self {
self.types = Some(ColumnType::String(Some(length)));
self
}
pub fn string(mut self) -> Self {
self.types = Some(ColumnType::String(None));
self
}
pub fn text(mut self) -> Self {
self.types = Some(ColumnType::Text);
self
}
pub fn tiny_integer_len(mut self, length: u32) -> Self {
self.types = Some(ColumnType::TinyInteger(Some(length)));
self
}
pub fn tiny_integer(mut self) -> Self {
self.types = Some(ColumnType::TinyInteger(None));
self
}
pub fn small_integer_len(mut self, length: u32) -> Self {
self.types = Some(ColumnType::SmallInteger(Some(length)));
self
}
pub fn small_integer(mut self) -> Self {
self.types = Some(ColumnType::SmallInteger(None));
self
}
pub fn integer_len(mut self, length: u32) -> Self {
self.types = Some(ColumnType::Integer(Some(length)));
self
}
pub fn integer(mut self) -> Self {
self.types = Some(ColumnType::Integer(None));
self
}
pub fn big_integer_len(mut self, length: u32) -> Self {
self.types = Some(ColumnType::BigInteger(Some(length)));
self
}
pub fn big_integer(mut self) -> Self {
self.types = Some(ColumnType::BigInteger(None));
self
}
pub fn float_len(mut self, precision: u32) -> Self {
self.types = Some(ColumnType::Float(Some(precision)));
self
}
pub fn float(mut self) -> Self {
self.types = Some(ColumnType::Float(None));
self
}
pub fn double_len(mut self, precision: u32) -> Self {
self.types = Some(ColumnType::Double(Some(precision)));
self
}
pub fn double(mut self) -> Self {
self.types = Some(ColumnType::Double(None));
self
}
pub fn decimal_len(mut self, precision: u32, scale: u32) -> Self {
self.types = Some(ColumnType::Decimal(Some((precision, scale))));
self
}
pub fn decimal(mut self) -> Self {
self.types = Some(ColumnType::Decimal(None));
self
}
pub fn date_time_len(mut self, precision: u32) -> Self {
self.types = Some(ColumnType::DateTime(Some(precision)));
self
}
pub fn date_time(mut self) -> Self {
self.types = Some(ColumnType::DateTime(None));
self
}
pub fn timestamp_len(mut self, precision: u32) -> Self {
self.types = Some(ColumnType::Timestamp(Some(precision)));
self
}
pub fn timestamp(mut self) -> Self {
self.types = Some(ColumnType::Timestamp(None));
self
}
pub fn time_len(mut self, precision: u32) -> Self {
self.types = Some(ColumnType::Time(Some(precision)));
self
}
pub fn time(mut self) -> Self {
self.types = Some(ColumnType::Time(None));
self
}
pub fn date(mut self) -> Self {
self.types = Some(ColumnType::Date);
self
}
pub fn binary_len(mut self, length: u32) -> Self {
self.types = Some(ColumnType::Binary(Some(length)));
self
}
pub fn binary(mut self) -> Self {
self.types = Some(ColumnType::Binary(None));
self
}
pub fn boolean(mut self) -> Self {
self.types = Some(ColumnType::Boolean);
self
}
pub fn money_len(mut self, precision: u32, scale: u32) -> Self {
self.types = Some(ColumnType::Money(Some((precision, scale))));
self
}
pub fn money(mut self) -> Self {
self.types = Some(ColumnType::Money(None));
self
}
pub fn json(mut self) -> Self {
self.types = Some(ColumnType::Json);
self
}
pub fn json_binary(mut self) -> Self {
self.types = Some(ColumnType::JsonBinary);
self
}
pub fn custom<T: 'static>(mut self, n: T) -> Self
where T: Iden {
self.types = Some(ColumnType::Custom(Rc::new(n)));
self
}
pub fn extra(mut self, string: String) -> Self {
self.spec.push(ColumnSpec::Extra(string));
self
}
}
#[derive(Debug, Clone)]
pub enum ColumnType {
Char(Option<u32>),
String(Option<u32>),
Text,
TinyInteger(Option<u32>),
SmallInteger(Option<u32>),
Integer(Option<u32>),
BigInteger(Option<u32>),
Float(Option<u32>),
Double(Option<u32>),
Decimal(Option<(u32, u32)>),
DateTime(Option<u32>),
Timestamp(Option<u32>),
Time(Option<u32>),
Date,
Binary(Option<u32>),
Boolean,
Money(Option<(u32, u32)>),
Json,
JsonBinary,
Custom(Rc<dyn Iden>),
}
#[derive(Debug, Clone)]
pub enum ColumnSpec {
Null,
NotNull,
Default(Value),
AutoIncrement,
UniqueKey,
PrimaryKey,
Extra(String),
}