diesel/query_builder/update_statement/
changeset.rs1use backend::Backend;
2use expression::operators::Eq;
3use expression::AppearsOnTable;
4use query_builder::*;
5use query_source::{Column, QuerySource};
6use result::QueryResult;
7
8pub trait AsChangeset {
24 type Target: QuerySource;
26
27 type Changeset;
29
30 fn as_changeset(self) -> Self::Changeset;
32}
33
34impl<T: AsChangeset> AsChangeset for Option<T> {
35 type Target = T::Target;
36 type Changeset = Option<T::Changeset>;
37
38 fn as_changeset(self) -> Self::Changeset {
39 self.map(|v| v.as_changeset())
40 }
41}
42
43impl<Left, Right> AsChangeset for Eq<Left, Right>
44where
45 Left: Column,
46 Right: AppearsOnTable<Left::Table>,
47{
48 type Target = Left::Table;
49 type Changeset = Assign<Left, Right>;
50
51 fn as_changeset(self) -> Self::Changeset {
52 Assign {
53 _column: self.left,
54 expr: self.right,
55 }
56 }
57}
58
59#[derive(Debug, Clone, Copy)]
60pub struct Assign<Col, Expr> {
61 _column: Col,
62 expr: Expr,
63}
64
65impl<T, U, DB> QueryFragment<DB> for Assign<T, U>
66where
67 DB: Backend,
68 T: Column,
69 U: QueryFragment<DB>,
70{
71 fn walk_ast(&self, mut out: AstPass<DB>) -> QueryResult<()> {
72 out.push_identifier(T::NAME)?;
73 out.push_sql(" = ");
74 QueryFragment::walk_ast(&self.expr, out)
75 }
76}