use crate::dialect::SqlDialect;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DbTableDescriptor {
pub name: String,
pub pk_cols: Vec<DbColumnDescription>,
pub cols: Vec<DbColumnDescription>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DbColumnDescription {
pub name: String,
pub db_type: DbType,
pub nullable: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DbType {
Integer,
Text,
Blob,
Uuid,
Other,
}
impl DbType {
pub fn sql_type(self, dialect: SqlDialect) -> &'static str {
match (dialect, self) {
(SqlDialect::Sqlite, DbType::Integer) => "INTEGER",
(SqlDialect::Sqlite, DbType::Text) => "TEXT",
(SqlDialect::Sqlite, DbType::Blob | DbType::Uuid) => "BLOB",
(SqlDialect::Postgres, DbType::Integer) => "BIGINT",
(SqlDialect::Postgres, DbType::Text) => "TEXT",
(SqlDialect::Postgres, DbType::Blob) => "BYTEA",
(SqlDialect::Postgres, DbType::Uuid) => "UUID",
(_, DbType::Other) => {
unreachable!("DbType::Other is introspection-only and never rendered as DDL")
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sql_type_maps_to_sqlite_names() {
assert_eq!(DbType::Integer.sql_type(SqlDialect::Sqlite), "INTEGER");
assert_eq!(DbType::Text.sql_type(SqlDialect::Sqlite), "TEXT");
assert_eq!(DbType::Blob.sql_type(SqlDialect::Sqlite), "BLOB");
assert_eq!(DbType::Uuid.sql_type(SqlDialect::Sqlite), "BLOB");
}
#[test]
fn sql_type_maps_to_postgres_names() {
assert_eq!(DbType::Integer.sql_type(SqlDialect::Postgres), "BIGINT");
assert_eq!(DbType::Text.sql_type(SqlDialect::Postgres), "TEXT");
assert_eq!(DbType::Blob.sql_type(SqlDialect::Postgres), "BYTEA");
assert_eq!(DbType::Uuid.sql_type(SqlDialect::Postgres), "UUID");
}
}