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