datasources-postgres 0.1.55

Postgres datasource provider
Documentation
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,
    }
}