typed_sql/query/select/
queryable.rs

1use crate::types::Field;
2use crate::Table;
3use std::marker::PhantomData;
4
5pub struct QueryableWriter<Q: ?Sized> {
6    queryable: PhantomData<Q>,
7}
8
9impl<Q: Queryable + ?Sized> WriteQueryable for QueryableWriter<Q> {
10    fn write_query(&self, sql: &mut String) {
11        Q::write_queryable(sql);
12    }
13}
14
15pub trait Queryable {
16    fn write_queryable(sql: &mut String);
17
18    fn queryable() -> QueryableWriter<Self> {
19        QueryableWriter {
20            queryable: PhantomData,
21        }
22    }
23}
24
25pub trait WriteQueryable {
26    fn write_query(&self, sql: &mut String);
27}
28
29pub struct WildCard;
30
31impl WriteQueryable for WildCard {
32    fn write_query(&self, sql: &mut String) {
33        sql.push('*');
34    }
35}
36
37pub struct Count<T> {
38    column: T,
39}
40
41impl<T> Count<T> {
42    pub(crate) fn new(column: T) -> Self {
43        Self { column }
44    }
45}
46
47impl WriteQueryable for Count<()> {
48    fn write_query(&self, sql: &mut String) {
49        write_wildcard(sql);
50    }
51}
52
53impl WriteQueryable for Count<WildCard> {
54    fn write_query(&self, sql: &mut String) {
55        write_wildcard(sql);
56    }
57}
58
59impl<T: Table, A> WriteQueryable for Count<Field<T, A>> {
60    fn write_query(&self, sql: &mut String) {
61        sql.push_str("COUNT(");
62        self.column.write_field(sql);
63        sql.push(')');
64    }
65}
66
67fn write_wildcard(sql: &mut String) {
68    sql.push_str("COUNT(*)");
69}