#[derive(Debug, Clone)]
pub enum ColumnType {
SmallInteger,
Integer,
BigInteger,
Float,
Double,
Decimal {
precision: u32,
scale: u32,
},
String,
Text,
Boolean,
Date,
Time,
DateTime,
Timestamp,
TimestampTz,
Uuid,
Json,
Jsonb,
Binary,
IntegerArray,
TextArray,
Custom(String),
}
impl ColumnType {
pub fn to_postgres_sql(&self) -> String {
match self {
ColumnType::SmallInteger => "SMALLINT".to_string(),
ColumnType::Integer => "INTEGER".to_string(),
ColumnType::BigInteger => "BIGINT".to_string(),
ColumnType::Float => "REAL".to_string(),
ColumnType::Double => "DOUBLE PRECISION".to_string(),
ColumnType::Decimal { precision, scale } => {
format!("DECIMAL({}, {})", precision, scale)
}
ColumnType::String => "VARCHAR(255)".to_string(),
ColumnType::Text => "TEXT".to_string(),
ColumnType::Boolean => "BOOLEAN".to_string(),
ColumnType::Date => "DATE".to_string(),
ColumnType::Time => "TIME".to_string(),
ColumnType::DateTime => "TIMESTAMP".to_string(),
ColumnType::Timestamp => "TIMESTAMP".to_string(),
ColumnType::TimestampTz => "TIMESTAMPTZ".to_string(),
ColumnType::Uuid => "UUID".to_string(),
ColumnType::Json => "JSON".to_string(),
ColumnType::Jsonb => "JSONB".to_string(),
ColumnType::Binary => "BYTEA".to_string(),
ColumnType::IntegerArray => "INTEGER[]".to_string(),
ColumnType::TextArray => "TEXT[]".to_string(),
ColumnType::Custom(sql) => sql.clone(),
}
}
pub fn to_mysql_sql(&self) -> String {
match self {
ColumnType::SmallInteger => "SMALLINT".to_string(),
ColumnType::Integer => "INT".to_string(),
ColumnType::BigInteger => "BIGINT".to_string(),
ColumnType::Float => "FLOAT".to_string(),
ColumnType::Double => "DOUBLE".to_string(),
ColumnType::Decimal { precision, scale } => {
format!("DECIMAL({}, {})", precision, scale)
}
ColumnType::String => "VARCHAR(255)".to_string(),
ColumnType::Text => "TEXT".to_string(),
ColumnType::Boolean => "TINYINT(1)".to_string(),
ColumnType::Date => "DATE".to_string(),
ColumnType::Time => "TIME".to_string(),
ColumnType::DateTime => "DATETIME".to_string(),
ColumnType::Timestamp | ColumnType::TimestampTz => "TIMESTAMP".to_string(),
ColumnType::Uuid => "CHAR(36)".to_string(),
ColumnType::Json | ColumnType::Jsonb => "JSON".to_string(),
ColumnType::Binary => "BLOB".to_string(),
ColumnType::IntegerArray | ColumnType::TextArray => "JSON".to_string(),
ColumnType::Custom(sql) => sql.clone(),
}
}
pub fn to_sqlite_sql(&self) -> String {
match self {
ColumnType::SmallInteger
| ColumnType::Integer
| ColumnType::BigInteger
| ColumnType::Boolean => "INTEGER".to_string(),
ColumnType::Float | ColumnType::Double | ColumnType::Decimal { .. } => {
"REAL".to_string()
}
ColumnType::String
| ColumnType::Text
| ColumnType::Uuid
| ColumnType::Date
| ColumnType::Time
| ColumnType::DateTime
| ColumnType::Timestamp
| ColumnType::TimestampTz
| ColumnType::Json
| ColumnType::Jsonb
| ColumnType::IntegerArray
| ColumnType::TextArray => "TEXT".to_string(),
ColumnType::Binary => "BLOB".to_string(),
ColumnType::Custom(sql) => sql.clone(),
}
}
}
#[derive(Debug, Clone)]
pub enum DefaultValue {
String(String),
Integer(i64),
Float(f64),
Boolean(bool),
Raw(String),
Null,
}
impl DefaultValue {
pub fn to_sql(&self) -> String {
match self {
DefaultValue::String(value) => format!("'{}'", value.replace('\'', "''")),
DefaultValue::Integer(value) => value.to_string(),
DefaultValue::Float(value) => value.to_string(),
DefaultValue::Boolean(value) => {
if *value {
"TRUE".to_string()
} else {
"FALSE".to_string()
}
}
DefaultValue::Raw(value) => value.clone(),
DefaultValue::Null => "NULL".to_string(),
}
}
}
impl From<&str> for DefaultValue {
fn from(value: &str) -> Self {
DefaultValue::String(value.to_string())
}
}
impl From<String> for DefaultValue {
fn from(value: String) -> Self {
DefaultValue::String(value)
}
}
impl From<i32> for DefaultValue {
fn from(value: i32) -> Self {
DefaultValue::Integer(value as i64)
}
}
impl From<i64> for DefaultValue {
fn from(value: i64) -> Self {
DefaultValue::Integer(value)
}
}
impl From<f64> for DefaultValue {
fn from(value: f64) -> Self {
DefaultValue::Float(value)
}
}
impl From<bool> for DefaultValue {
fn from(value: bool) -> Self {
DefaultValue::Boolean(value)
}
}