typed_sql/query/
update.rs

1use 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> {}