mod variants;
use crate::database::introspection::Enum;
use crate::generators::rust::casing;
const DERIVES: &str = "#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, \
Deserialize, sqlx::Type, ToSchema, TS)]";
pub fn module(referenced: &[&Enum]) -> String {
let mut file = String::from(
"//! Postgres enum types, declared once and shared by every model.\n\n\
use serde::{Deserialize, Serialize};\n\
use ts_rs::TS;\n\
use utoipa::ToSchema;\n\n",
);
let declarations = referenced
.iter()
.map(|item| declaration(item))
.collect::<Vec<_>>()
.join("\n");
file.push_str(&declarations);
file
}
fn declaration(item: &Enum) -> String {
format!(
"/// The `{}` Postgres enum.\n\
{DERIVES}\n\
#[sqlx(type_name = \"{}\")]\n\
pub enum {} {{\n{}}}\n",
item.name,
item.name,
casing::to_pascal(&item.name),
variants::render(item)
)
}