typed_sql/query/select/
selectable.rs1use 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> {}