1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
use crate::types::Field; use crate::Table; pub trait Queryable { fn write_query(&self, sql: &mut String); } pub struct WildCard; impl Queryable for WildCard { fn write_query(&self, sql: &mut String) { sql.push('*'); } } pub struct Count<T> { column: T, } impl<T> Count<T> { pub(crate) fn new(column: T) -> Self { Self { column } } } impl Queryable for Count<()> { fn write_query(&self, sql: &mut String) { write_wildcard(sql); } } impl Queryable for Count<WildCard> { fn write_query(&self, sql: &mut String) { write_wildcard(sql); } } impl<T: Table, A> Queryable for Count<Field<T, A>> { fn write_query(&self, sql: &mut String) { sql.push_str("COUNT("); self.column.write_field(sql); sql.push(')'); } } fn write_wildcard(sql: &mut String) { sql.push_str("COUNT(*)"); }