1use crate::qb::{bind::BindValue, condition::Condition};
2use std::marker::PhantomData;
3
4pub struct Column<T> {
21 pub name: &'static str,
23
24 pub table_alias: &'static str,
26
27 pub _marker: PhantomData<T>,
29}
30impl<T> AsRef<str> for Column<T> {
31 fn as_ref(&self) -> &str {
32 self.name
33 }
34}
35
36impl<T> Copy for Column<T> {}
37impl<T> Clone for Column<T> {
38 fn clone(&self) -> Self {
39 *self
40 }
41}
42
43impl<T> Column<T>
44where
45 T: BindValue + Clone,
46{
47 fn qualified_name(&self) -> String {
49 format!("{}.{}", self.table_alias, self.name)
50 }
51
52 pub fn eq(self, val: T) -> Condition {
54 Condition::new(format!("{} = ?", self.qualified_name()), val)
55 }
56
57 pub fn ne(self, val: T) -> Condition {
59 Condition::new(format!("{} <> ?", self.qualified_name()), val)
60 }
61
62 pub fn gt(self, val: T) -> Condition {
64 Condition::new(format!("{} > ?", self.qualified_name()), val)
65 }
66
67 pub fn ge(self, val: T) -> Condition {
69 Condition::new(format!("{} >= ?", self.qualified_name()), val)
70 }
71
72 pub fn lt(self, val: T) -> Condition {
74 Condition::new(format!("{} < ?", self.qualified_name()), val)
75 }
76
77 pub fn le(self, val: T) -> Condition {
79 Condition::new(format!("{} <= ?", self.qualified_name()), val)
80 }
81
82 pub fn like(self, val: T) -> Condition {
84 Condition::new(format!("{} LIKE ?", self.qualified_name()), val)
85 }
86
87 pub fn in_(self, vals: Vec<T>) -> Condition {
91 if vals.is_empty() {
92 panic!("Cannot create IN condition with empty value list. At least one value must be specified.");
93 }
94 let placeholders: Vec<String> = (0..vals.len()).map(|_| "?".to_string()).collect();
95 let sql = format!("{} IN ({})", self.qualified_name(), placeholders.join(", "));
96 Condition::multi(sql, vals)
97 }
98
99 pub fn not_in(self, vals: Vec<T>) -> Condition {
101 if vals.is_empty() {
102 panic!("Cannot create NOT IN condition with empty value list. At least one value must be specified.");
103 }
104 let placeholders: Vec<String> = (0..vals.len()).map(|_| "?".to_string()).collect();
105 let sql = format!("{} NOT IN ({})", self.qualified_name(), placeholders.join(", "));
106 Condition::multi(sql, vals)
107 }
108
109 pub fn is_null(self) -> Condition {
111 Condition::none(format!("{} IS NULL", self.qualified_name()))
112 }
113
114 pub fn is_not_null(self) -> Condition {
116 Condition::none(format!("{} IS NOT NULL", self.qualified_name()))
117 }
118
119 pub fn between(self, start: T, end: T) -> Condition {
121 let sql = format!("{} BETWEEN ? AND ?", self.qualified_name());
122 Condition::multi(sql, vec![start, end])
123 }
124
125 pub fn not_between(self, start: T, end: T) -> Condition {
127 let sql = format!("{} NOT BETWEEN ? AND ?", self.qualified_name());
128 Condition::multi(sql, vec![start, end])
129 }
130}