use super::model::DatabaseEnum;
use crate::database::introspection;
use crate::database::migrations::CustomMigrationError;
use sqlx::Row;
pub(crate) async fn postgres_enums(
conn: &sqlx::PgPool,
) -> Result<Vec<DatabaseEnum>, CustomMigrationError> {
let rows = sqlx::query(introspection::queries::ENUMS)
.bind("public")
.fetch_all(conn)
.await
.map_err(|e| CustomMigrationError::SendError(Box::new(e)))?;
let mut by_name: std::collections::BTreeMap<String, Vec<String>> =
std::collections::BTreeMap::new();
for row in rows {
let name: String = row.get("name");
let value: String = row.get("value");
by_name.entry(name).or_default().push(value);
}
Ok(by_name
.into_iter()
.map(|(name, values)| DatabaseEnum {
name,
values,
table: None,
column: None,
})
.collect())
}