use std::fmt;
use super::WrappedDefault;
#[derive(PartialEq, Debug, Clone)]
pub struct WrapVec<T>(pub Vec<T>);
#[derive(PartialEq, Debug, Clone)]
pub enum Constraint {
Unique,
}
impl fmt::Display for Constraint {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Unique => write!(f, "UNIQUE"),
}
}
}
#[derive(PartialEq, Debug, Clone)]
pub enum BaseType {
Text,
Varchar(usize),
Char(usize),
Primary,
Integer,
Serial,
Float,
Double,
UUID,
Boolean,
Json,
Date,
Time,
DateTime,
Binary,
Foreign(
Option<String>,
String,
WrapVec<String>,
ReferentialAction,
ReferentialAction,
),
Custom(&'static str),
Array(Box<BaseType>),
Index(Vec<String>),
Constraint(Constraint, Vec<String>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Type {
pub nullable: bool,
pub unique: bool,
pub increments: bool,
pub indexed: bool,
pub primary: bool,
pub default: Option<WrappedDefault<'static>>,
pub size: Option<usize>,
pub inner: BaseType,
}
#[cfg_attr(rustfmt, rustfmt_skip)]
impl Type {
pub(crate) fn new(inner: BaseType) -> Self {
Self {
nullable: false,
unique: false,
increments: false,
indexed: false,
primary: false,
default: None,
size: None,
inner,
}
}
pub(crate) fn get_inner(&self) -> BaseType {
self.inner.clone()
}
pub fn nullable(self, arg: bool) -> Self {
Self { nullable: arg, ..self }
}
pub fn unique(self, arg: bool) -> Self {
Self { unique: arg, ..self }
}
pub fn increments(self, arg: bool) -> Self {
Self { increments: arg, ..self }
}
pub fn indexed(self, arg: bool) -> Self {
Self { indexed: arg, ..self }
}
pub fn primary(self, arg: bool) -> Self {
Self { primary: arg, ..self }
}
pub fn default(self, arg: impl Into<WrappedDefault<'static>>) -> Self {
Self { default: Some(arg.into()), ..self }
}
pub fn size(self, arg: usize) -> Self {
Self { size: Some(arg), ..self }
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ReferentialAction {
Unset,
NoAction,
Restrict,
SetNull,
SetDefault,
Cascade,
}
impl ReferentialAction {
pub fn on_delete(&self) -> String {
format!("ON DELETE {}", self)
}
pub fn on_update(&self) -> String {
format!("ON UPDATE {}", self)
}
}
impl std::fmt::Display for ReferentialAction {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::Unset => panic!("The Unset variant cannot be displayed!"),
Self::NoAction => "NO ACTION",
Self::Restrict => "RESTRICT",
Self::SetNull => "SET NULL",
Self::SetDefault => "SET DEFAULT",
Self::Cascade => "CASCADE",
};
write!(f, "{}", s)
}
}
impl<'a> From<&'a str> for WrapVec<String> {
fn from(s: &'a str) -> Self {
WrapVec(vec![s.into()])
}
}
impl From<String> for WrapVec<String> {
fn from(s: String) -> Self {
WrapVec(vec![s])
}
}
impl<I> From<Vec<I>> for WrapVec<String>
where
I: Into<String>,
{
fn from(v: Vec<I>) -> Self {
WrapVec(v.into_iter().map(|s| s.into()).collect())
}
}