use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::default::Default;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum IntegerSize {
I8,
U8,
I16,
U16,
I32,
U32,
I64,
U64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum DataType {
Text(Option<u32>),
Varchar(u32),
Char(u32),
Integer(IntegerSize),
SmallInt,
BigInt,
Boolean,
Float,
Double,
Decimal(u8, u8),
Date,
Time,
DateTime,
Timestamp,
TimestampTz,
Blob,
Json,
JsonB,
Uuid,
Enum(String, Vec<String>),
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReferentialAction {
NoAction,
Restrict,
Cascade,
SetNull,
SetDefault,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Constraint {
PrimaryKey {
name: Option<String>,
columns: Vec<String>,
},
Unique {
name: Option<String>,
columns: Vec<String>,
},
NotNull,
DefaultValue(String),
Check {
name: Option<String>,
expression: String,
},
ForeignKey {
name: Option<String>,
columns: Vec<String>,
references_table: String,
references_columns: Vec<String>,
on_delete: Option<ReferentialAction>,
on_update: Option<ReferentialAction>,
},
AutoIncrement,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ColumnDescriptor {
pub name: String,
pub data_type: DataType,
#[serde(default = "default_true")]
pub is_nullable: bool,
#[serde(default)]
pub is_primary_key: bool,
#[serde(default)]
pub is_unique: bool,
pub default_value: Option<String>,
#[serde(default)]
pub auto_increment: bool,
pub comment: Option<String>,
#[serde(default)]
pub constraints: Vec<Constraint>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum IndexType {
BTree,
Hash,
Gin,
Gist,
Spatial,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct IndexDescriptor {
pub name: Option<String>,
pub columns: Vec<String>,
#[serde(default)]
pub is_unique: bool,
pub index_type: Option<IndexType>,
pub condition: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ModelDescriptor {
pub name: String,
pub schema: Option<String>,
pub columns: Vec<ColumnDescriptor>,
pub primary_key: Option<Vec<String>>,
#[serde(default)]
pub indexes: Vec<IndexDescriptor>,
#[serde(default)]
pub constraints: Vec<Constraint>,
pub comment: Option<String>,
pub engine: Option<String>,
pub charset: Option<String>,
pub collation: Option<String>,
#[serde(default)]
pub options: HashMap<String, String>,
}
fn default_true() -> bool {
true
}
impl Default for ColumnDescriptor {
fn default() -> Self {
ColumnDescriptor {
name: String::new(),
data_type: DataType::Text(None),
is_nullable: default_true(),
is_primary_key: false,
is_unique: false,
default_value: None,
auto_increment: false,
comment: None,
constraints: Vec::new(),
}
}
}