use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TableMetadata {
pub name: String,
pub comment: Option<String>,
pub columns: Vec<ColumnMetadata>,
pub indexes: Vec<IndexMetadata>,
pub foreign_keys: Vec<ForeignKeyMetadata>,
pub primary_key: Option<PrimaryKey>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColumnMetadata {
pub name: String,
pub data_type: String,
pub nullable: bool,
pub default_value: Option<String>,
pub is_auto_increment: bool,
pub is_unsigned: bool,
pub enum_values: Option<Vec<String>>,
pub comment: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexMetadata {
pub name: String,
pub columns: Vec<String>,
pub unique: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PrimaryKey {
pub columns: Vec<String>,
}
impl PrimaryKey {
pub fn is_composite(&self) -> bool {
self.columns.len() > 1
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ForeignKeyMetadata {
pub column_name: String,
pub referenced_table: String,
pub referenced_column: String,
}
impl TableMetadata {
pub fn get_column(&self, name: &str) -> Option<&ColumnMetadata> {
self.columns.iter().find(|c| c.name == name)
}
pub fn get_indexed_columns(&self) -> Vec<&str> {
self.indexes
.iter()
.filter(|idx| idx.columns.len() == 1)
.map(|idx| idx.columns[0].as_str())
.collect()
}
pub fn is_primary_key_column(&self, column_name: &str) -> bool {
self.primary_key
.as_ref()
.map(|pk| pk.columns.contains(&column_name.to_string()))
.unwrap_or(false)
}
}
impl ColumnMetadata {
pub fn is_enum(&self) -> bool {
self.enum_values.is_some()
}
}