typed_sql/query/
update.rs1use super::predicate::{And, Eq, Op, Predicate};
2use crate::types::{Bind, Primitive};
3use crate::{CheckedSql, Table, ToSql};
4use std::marker::PhantomData;
5
6pub trait UpdateSet {
7 fn write_set(&self, sql: &mut String);
8}
9
10impl<T, A> UpdateSet for Op<T, A, Bind, Eq>
11where
12 T: Table,
13{
14 fn write_set(&self, sql: &mut String) {
15 self.write_predicate(sql);
16 }
17}
18
19impl<T, A, U> UpdateSet for Op<T, A, U, Eq>
20where
21 T: Table,
22 U: Primitive,
23{
24 fn write_set(&self, sql: &mut String) {
25 self.write_predicate(sql);
26 }
27}
28
29impl<H, T> UpdateSet for And<H, T>
30where
31 H: UpdateSet,
32 T: UpdateSet,
33{
34 fn write_set(&self, sql: &mut String) {
35 self.head.write_set(sql);
36 sql.push(',');
37 self.tail.write_set(sql);
38 }
39}
40
41pub struct Update<T: ?Sized, S> {
42 _table: PhantomData<T>,
43 set: S,
44}
45
46impl<T: ?Sized, S> Update<T, S> {
47 pub(crate) const fn new(set: S) -> Self {
48 Self {
49 _table: PhantomData,
50 set,
51 }
52 }
53}
54
55impl<T, S> ToSql for Update<T, S>
56where
57 T: Table + ?Sized,
58 S: UpdateSet,
59{
60 fn write_sql_unchecked(&self, sql: &mut String) {
61 sql.push_str("UPDATE ");
62 sql.push_str(T::NAME);
63 sql.push_str(" SET ");
64 self.set.write_set(sql);
65 }
66}
67
68impl<T: ?Sized, S: CheckedSql> CheckedSql for Update<T, S> {}