use crate::pgrx_sql::PgrxSql;
use crate::to_sql::ToSql;
use crate::to_sql::entity::ToSqlConfigEntity;
use crate::{SqlGraphEntity, SqlGraphIdentifier, TypeMatch};
#[derive(Debug, Clone, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub struct PostgresEnumEntity<'a> {
pub name: &'a str,
pub file: &'a str,
pub line: u32,
pub full_path: &'a str,
pub module_path: &'a str,
pub type_ident: &'a str,
pub variants: Vec<&'a str>,
pub to_sql_config: ToSqlConfigEntity<'a>,
}
impl TypeMatch for PostgresEnumEntity<'_> {
fn type_ident(&self) -> &str {
self.type_ident
}
}
impl<'a> From<PostgresEnumEntity<'a>> for SqlGraphEntity<'a> {
fn from(val: PostgresEnumEntity<'a>) -> Self {
SqlGraphEntity::Enum(val)
}
}
impl SqlGraphIdentifier for PostgresEnumEntity<'_> {
fn dot_identifier(&self) -> String {
format!("enum {}", self.full_path)
}
fn rust_identifier(&self) -> String {
self.full_path.to_string()
}
fn file(&self) -> Option<&str> {
Some(self.file)
}
fn line(&self) -> Option<u32> {
Some(self.line)
}
}
impl ToSql for PostgresEnumEntity<'_> {
fn to_sql(&self, context: &PgrxSql) -> eyre::Result<String> {
let self_index = context.enums[self];
let sql = format!(
"\n\
-- {file}:{line}\n\
-- {full_path}\n\
CREATE TYPE {schema}{name} AS ENUM (\n\
{variants}\
);\
",
schema = context.schema_prefix_for(&self_index),
full_path = self.full_path,
file = self.file,
line = self.line,
name = self.name,
variants = self
.variants
.iter()
.map(|variant| format!("\t'{variant}'"))
.collect::<Vec<_>>()
.join(",\n")
+ "\n",
);
Ok(sql)
}
}