use super::iden::{DynIden, IntoIden};
#[derive(Debug, Clone)]
pub enum ColumnRef {
Column(DynIden),
TableColumn(DynIden, DynIden),
SchemaTableColumn(DynIden, DynIden, DynIden),
Asterisk,
TableAsterisk(DynIden),
}
impl ColumnRef {
pub fn column<I: IntoIden>(column: I) -> Self {
Self::Column(column.into_iden())
}
pub fn table_column<T: IntoIden, C: IntoIden>(table: T, column: C) -> Self {
Self::TableColumn(table.into_iden(), column.into_iden())
}
pub fn schema_table_column<S: IntoIden, T: IntoIden, C: IntoIden>(
schema: S,
table: T,
column: C,
) -> Self {
Self::SchemaTableColumn(schema.into_iden(), table.into_iden(), column.into_iden())
}
pub fn asterisk() -> Self {
Self::Asterisk
}
pub fn table_asterisk<T: IntoIden>(table: T) -> Self {
Self::TableAsterisk(table.into_iden())
}
}
pub trait IntoColumnRef {
fn into_column_ref(self) -> ColumnRef;
}
impl IntoColumnRef for ColumnRef {
fn into_column_ref(self) -> ColumnRef {
self
}
}
impl<T: IntoIden> IntoColumnRef for T {
fn into_column_ref(self) -> ColumnRef {
ColumnRef::Column(self.into_iden())
}
}
impl<T, C> IntoColumnRef for (T, C)
where
T: IntoIden,
C: IntoIden,
{
fn into_column_ref(self) -> ColumnRef {
ColumnRef::TableColumn(self.0.into_iden(), self.1.into_iden())
}
}
impl<S, T, C> IntoColumnRef for (S, T, C)
where
S: IntoIden,
T: IntoIden,
C: IntoIden,
{
fn into_column_ref(self) -> ColumnRef {
ColumnRef::SchemaTableColumn(self.0.into_iden(), self.1.into_iden(), self.2.into_iden())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::Alias;
use rstest::rstest;
#[rstest]
fn test_column_ref_simple() {
let col = ColumnRef::column("name");
if let ColumnRef::Column(iden) = col {
assert_eq!(iden.to_string(), "name");
} else {
panic!("Expected Column variant");
}
}
#[rstest]
fn test_column_ref_table_qualified() {
let col = ColumnRef::table_column("users", "name");
if let ColumnRef::TableColumn(table, column) = col {
assert_eq!(table.to_string(), "users");
assert_eq!(column.to_string(), "name");
} else {
panic!("Expected TableColumn variant");
}
}
#[rstest]
fn test_column_ref_schema_qualified() {
let col = ColumnRef::schema_table_column("public", "users", "name");
if let ColumnRef::SchemaTableColumn(schema, table, column) = col {
assert_eq!(schema.to_string(), "public");
assert_eq!(table.to_string(), "users");
assert_eq!(column.to_string(), "name");
} else {
panic!("Expected SchemaTableColumn variant");
}
}
#[rstest]
fn test_column_ref_asterisk() {
let col = ColumnRef::asterisk();
assert!(matches!(col, ColumnRef::Asterisk));
}
#[rstest]
fn test_column_ref_table_asterisk() {
let col = ColumnRef::table_asterisk("users");
if let ColumnRef::TableAsterisk(table) = col {
assert_eq!(table.to_string(), "users");
} else {
panic!("Expected TableAsterisk variant");
}
}
#[rstest]
fn test_into_column_ref_from_str() {
let col: ColumnRef = "name".into_column_ref();
if let ColumnRef::Column(iden) = col {
assert_eq!(iden.to_string(), "name");
} else {
panic!("Expected Column variant");
}
}
#[rstest]
fn test_into_column_ref_from_alias() {
let alias = Alias::new("my_column");
let col: ColumnRef = alias.into_column_ref();
if let ColumnRef::Column(iden) = col {
assert_eq!(iden.to_string(), "my_column");
} else {
panic!("Expected Column variant");
}
}
}