sea_schema/postgres/query/
enumeration.rs

1use super::SchemaQueryBuilder;
2use crate::sqlx_types::postgres::PgRow;
3use sea_query::{Expr, Order, Query, SelectStatement};
4
5#[derive(Debug, sea_query::Iden)]
6pub enum PgType {
7    #[iden = "pg_type"]
8    Table,
9    #[iden = "typname"]
10    TypeName,
11    #[iden = "oid"]
12    Oid,
13}
14
15#[derive(Debug, sea_query::Iden)]
16pub enum PgEnum {
17    #[iden = "pg_enum"]
18    Table,
19    #[iden = "enumlabel"]
20    EnumLabel,
21    #[iden = "enumtypid"]
22    EnumTypeId,
23    #[iden = "enumsortorder"]
24    EnumSortOrder,
25}
26
27#[derive(Debug, Default)]
28pub struct EnumQueryResult {
29    pub typename: String,
30    pub enumlabel: String,
31}
32
33impl SchemaQueryBuilder {
34    pub fn query_enums(&self) -> SelectStatement {
35        Query::select()
36            .column((PgType::Table, PgType::TypeName))
37            .column((PgEnum::Table, PgEnum::EnumLabel))
38            .from(PgType::Table)
39            .inner_join(
40                PgEnum::Table,
41                Expr::col((PgEnum::Table, PgEnum::EnumTypeId)).equals((PgType::Table, PgType::Oid)),
42            )
43            .order_by((PgType::Table, PgType::TypeName), Order::Asc)
44            .order_by((PgEnum::Table, PgEnum::EnumSortOrder), Order::Asc)
45            .order_by((PgEnum::Table, PgEnum::EnumLabel), Order::Asc)
46            .take()
47    }
48}
49
50#[cfg(feature = "sqlx-postgres")]
51impl From<&PgRow> for EnumQueryResult {
52    fn from(row: &PgRow) -> Self {
53        use crate::sqlx_types::Row;
54        Self {
55            typename: row.get(0),
56            enumlabel: row.get(1),
57        }
58    }
59}
60
61#[cfg(not(feature = "sqlx-postgres"))]
62impl From<&PgRow> for EnumQueryResult {
63    fn from(_: &PgRow) -> Self {
64        Self::default()
65    }
66}