use crate::query::ast::SelectItem;
use crate::query::column::Column;
use crate::query::expr::Expr;
pub trait IntoSelectItem {
fn into_select_item(self) -> SelectItem;
}
impl<M, T> IntoSelectItem for Column<M, T> {
fn into_select_item(self) -> SelectItem {
SelectItem::Column {
table: self.table(),
column: self.name(),
}
}
}
impl IntoSelectItem for Expr {
fn into_select_item(self) -> SelectItem {
SelectItem::Expression(self)
}
}
pub trait IntoExpr {
fn into_expr(self) -> Expr;
}
impl<M, T> IntoExpr for Column<M, T> {
fn into_expr(self) -> Expr {
self.expr()
}
}
impl IntoExpr for Expr {
fn into_expr(self) -> Expr {
self
}
}
pub trait Projection {
fn into_select_items(self) -> Vec<SelectItem>;
}
pub trait ExprTuple {
fn into_exprs(self) -> Vec<Expr>;
}
macro_rules! impl_tuples {
($($name:ident),+) => {
impl<$($name),+> Projection for ($($name,)+)
where
$($name: IntoSelectItem,)+
{
fn into_select_items(self) -> Vec<SelectItem> {
#[allow(non_snake_case)]
let ($($name,)+) = self;
vec![$($name.into_select_item()),+]
}
}
impl<$($name),+> ExprTuple for ($($name,)+)
where
$($name: IntoExpr,)+
{
fn into_exprs(self) -> Vec<Expr> {
#[allow(non_snake_case)]
let ($($name,)+) = self;
vec![$($name.into_expr()),+]
}
}
};
}
impl_tuples!(A);
impl_tuples!(A, B);
impl_tuples!(A, B, C);
impl_tuples!(A, B, C, D);
impl_tuples!(A, B, C, D, E);
impl_tuples!(A, B, C, D, E, F);
impl_tuples!(A, B, C, D, E, F, G);
impl_tuples!(A, B, C, D, E, F, G, H);
impl_tuples!(A, B, C, D, E, F, G, H, I);
impl_tuples!(A, B, C, D, E, F, G, H, I, J);
impl_tuples!(A, B, C, D, E, F, G, H, I, J, K);
impl_tuples!(A, B, C, D, E, F, G, H, I, J, K, L);