typed_sql/query/select/
selectable.rs

1use super::join::JoinSelect;
2use super::WriteQueryable;
3use crate::table::{Table, TableQuery};
4use crate::{CheckedSql, ToSql};
5
6pub trait Selectable {
7    type Table: Table + ?Sized;
8    type Fields: Default;
9
10    fn write_join(&self, sql: &mut String);
11}
12
13impl<T: Table + ?Sized> Selectable for TableQuery<T> {
14    type Table = T;
15    type Fields = T::Fields;
16
17    fn write_join(&self, _sql: &mut String) {}
18}
19
20impl<J: JoinSelect> Selectable for J {
21    type Table = J::Table;
22    type Fields = J::Fields;
23
24    fn write_join(&self, sql: &mut String) {
25        self.write_join_select(sql);
26    }
27}
28
29#[derive(Clone, Copy)]
30pub struct SelectStatement<S, Q> {
31    from: S,
32    query: Q,
33}
34
35impl<S: Selectable, Q> SelectStatement<S, Q> {
36    pub fn new(from: S, query: Q) -> Self {
37        Self { from, query }
38    }
39}
40
41impl<S, Q> ToSql for SelectStatement<S, Q>
42where
43    S: Selectable,
44    Q: WriteQueryable,
45{
46    fn write_sql_unchecked(&self, sql: &mut String) {
47        sql.push_str("SELECT ");
48        self.query.write_query(sql);
49        sql.push_str(" FROM ");
50        sql.push_str(S::Table::NAME);
51        self.from.write_join(sql);
52    }
53}
54
55impl<S, Q> CheckedSql for SelectStatement<S, Q> {}