use crate::converters::field;
use datasources::{Column, ColumnDefault, CreateTableStatementTextRenderer, Value};
pub struct PostgresCreateTableStatementRenderer;
impl CreateTableStatementTextRenderer for PostgresCreateTableStatementRenderer {
fn quote(&self, name: &str) -> String {
crate::PostgresDriver::quote(name)
}
fn type_name(&self, column: &Column) -> String {
crate::PostgresDriver::native_type(column)
}
fn column_default(&self, column: &Column) -> String {
match (column.default.as_ref(), literal(column)) {
(Some(value), Some(text)) => {
self.write_default(Some(&ColumnDefault::new(text, value.name.as_deref())))
}
(Some(value), None) => self.write_default(Some(&ColumnDefault::new(
crate::PostgresDriver::native_default(column),
value.name.as_deref(),
))),
_ => String::new(),
}
}
fn identity(&self, column: &Column) -> String {
if column.identity {
" GENERATED BY DEFAULT AS IDENTITY".into()
} else {
String::new()
}
}
}
fn literal(column: &Column) -> Option<String> {
let raw = column.default.as_ref()?.value.as_str();
let number = raw.parse::<i64>().ok()?;
let converter = field(&column.type_name)?;
match converter.convert(&Value::Int(number)).ok()? {
Value::Bool(true) => Some("TRUE".into()),
Value::Bool(false) => Some("FALSE".into()),
_ => None,
}
}