mod field;
mod resolve;
use crate::database::introspection::{Enum, Schema};
use crate::generators::rust::casing;
pub use field::Field;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Model {
pub table: String,
pub module: String,
pub name: String,
pub fields: Vec<Field>,
pub view: bool,
pub actix: bool,
}
impl Model {
pub fn key(&self) -> Option<&Field> {
let mut keys = self.fields.iter().filter(|field| field.primary_key);
let first = keys.next();
if keys.next().is_some() {
return None;
}
first.or_else(|| {
self.view
.then(|| self.fields.iter().find(|field| field.column == "id"))
.flatten()
})
}
pub fn all_options_name(&self) -> String {
format!("{}AllOptions", self.name)
}
pub fn insertable(&self) -> Vec<&Field> {
self.fields.iter().filter(|f| f.insertable()).collect()
}
pub fn updatable(&self) -> Vec<&Field> {
self.fields.iter().filter(|f| f.updatable()).collect()
}
pub fn enums<'a>(&self, schema: &'a Schema) -> Vec<&'a Enum> {
let mut found: Vec<&Enum> = Vec::new();
for field in &self.fields {
let Some(item) = schema
.enums
.iter()
.find(|item| field.mapping.names(&casing::to_pascal(&item.name)))
else {
continue;
};
if !found.iter().any(|seen| seen.name == item.name) {
found.push(item);
}
}
found
}
}