Skip to main content

sql_orm/
query_projection.rs

1use crate::AliasedEntityColumn;
2use sql_orm_core::{Entity, EntityColumn};
3use sql_orm_query::{Expr, SelectProjection};
4
5pub trait SelectProjections {
6    fn into_select_projections(self) -> Vec<SelectProjection>;
7}
8
9impl<P> SelectProjections for Vec<P>
10where
11    P: Into<SelectProjection>,
12{
13    fn into_select_projections(self) -> Vec<SelectProjection> {
14        self.into_iter().map(Into::into).collect()
15    }
16}
17
18impl<P, const N: usize> SelectProjections for [P; N]
19where
20    P: Into<SelectProjection>,
21{
22    fn into_select_projections(self) -> Vec<SelectProjection> {
23        self.into_iter().map(Into::into).collect()
24    }
25}
26
27impl SelectProjections for SelectProjection {
28    fn into_select_projections(self) -> Vec<SelectProjection> {
29        vec![self]
30    }
31}
32
33impl SelectProjections for Expr {
34    fn into_select_projections(self) -> Vec<SelectProjection> {
35        vec![SelectProjection::from(self)]
36    }
37}
38
39impl<E> SelectProjections for EntityColumn<E>
40where
41    E: Entity,
42{
43    fn into_select_projections(self) -> Vec<SelectProjection> {
44        vec![SelectProjection::from(self)]
45    }
46}
47
48impl<E> SelectProjections for AliasedEntityColumn<E>
49where
50    E: Entity,
51{
52    fn into_select_projections(self) -> Vec<SelectProjection> {
53        vec![SelectProjection::from(self)]
54    }
55}
56
57macro_rules! impl_select_projections_tuple {
58    ($($name:ident),+ $(,)?) => {
59        impl<$($name),+> SelectProjections for ($($name,)+)
60        where
61            $($name: Into<SelectProjection>),+
62        {
63            #[allow(non_snake_case)]
64            fn into_select_projections(self) -> Vec<SelectProjection> {
65                let ($($name,)+) = self;
66                vec![$($name.into()),+]
67            }
68        }
69    };
70}
71
72impl_select_projections_tuple!(A);
73impl_select_projections_tuple!(A, B);
74impl_select_projections_tuple!(A, B, C);
75impl_select_projections_tuple!(A, B, C, D);
76impl_select_projections_tuple!(A, B, C, D, E);
77impl_select_projections_tuple!(A, B, C, D, E, F);
78impl_select_projections_tuple!(A, B, C, D, E, F, G);
79impl_select_projections_tuple!(A, B, C, D, E, F, G, H);
80impl_select_projections_tuple!(A, B, C, D, E, F, G, H, I);
81impl_select_projections_tuple!(A, B, C, D, E, F, G, H, I, J);
82impl_select_projections_tuple!(A, B, C, D, E, F, G, H, I, J, K);
83impl_select_projections_tuple!(A, B, C, D, E, F, G, H, I, J, K, L);