use crate::types::ColumnName;
use crate::types::DatabaseName;
use crate::types::Iden;
use crate::types::IntoIden;
use crate::types::SchemaName;
use crate::types::TableName;
pub trait MaybeQualifiedOnce {
fn into_2_parts(self) -> (Option<Iden>, Iden);
}
impl<T> MaybeQualifiedOnce for T
where
T: IntoIden,
{
fn into_2_parts(self) -> (Option<Iden>, Iden) {
(None, self.into_iden())
}
}
impl<S, T> MaybeQualifiedOnce for (S, T)
where
S: IntoIden,
T: IntoIden,
{
fn into_2_parts(self) -> (Option<Iden>, Iden) {
let (qual, base) = self;
(Some(qual.into_iden()), base.into_iden())
}
}
pub trait MaybeQualifiedTwice {
fn into_3_parts(self) -> (Option<(Option<Iden>, Iden)>, Iden);
}
impl<T> MaybeQualifiedTwice for T
where
T: MaybeQualifiedOnce,
{
fn into_3_parts(self) -> (Option<(Option<Iden>, Iden)>, Iden) {
let (middle, base) = self.into_2_parts();
let qual = middle.map(|middle| (None, middle));
(qual, base)
}
}
impl<S, T, U> MaybeQualifiedTwice for (S, T, U)
where
S: IntoIden,
T: IntoIden,
U: IntoIden,
{
fn into_3_parts(self) -> (Option<(Option<Iden>, Iden)>, Iden) {
let (q2, q1, base) = self;
let (q2, q1, base) = (q2.into_iden(), q1.into_iden(), base.into_iden());
let q = (Some(q2), q1);
(Some(q), base)
}
}
impl<T> From<T> for SchemaName
where
T: MaybeQualifiedOnce,
{
fn from(value: T) -> Self {
let (db, schema) = value.into_2_parts();
let db_name = db.map(DatabaseName);
SchemaName(db_name, schema)
}
}
impl<T> From<T> for TableName
where
T: MaybeQualifiedTwice,
{
fn from(value: T) -> Self {
let (schema_parts, table) = value.into_3_parts();
let schema_name = schema_parts.map(|schema_parts| match schema_parts {
(Some(db), schema) => SchemaName(Some(DatabaseName(db)), schema),
(None, schema) => SchemaName(None, schema),
});
TableName(schema_name, table)
}
}
impl<T> From<T> for ColumnName
where
T: MaybeQualifiedTwice,
{
fn from(value: T) -> Self {
let (table_parts, column) = value.into_3_parts();
let table_name = table_parts.map(|table_parts| match table_parts {
(Some(schema), table) => TableName(Some(schema.into()), table),
(None, table) => TableName(None, table),
});
ColumnName(table_name, column)
}
}