diesel/query_builder/upsert/
on_conflict_target_decorations.rs1use crate::backend::Backend;
2use crate::expression::Expression;
3use crate::query_builder::upsert::on_conflict_target::{ConflictTarget, NoConflictTarget};
4use crate::query_builder::where_clause::{NoWhereClause, WhereAnd, WhereClause};
5use crate::query_builder::{AstPass, QueryFragment, QueryResult};
6use crate::sql_types::BoolOrNullableBool;
7
8pub trait UndecoratedConflictTarget {}
9
10impl UndecoratedConflictTarget for NoConflictTarget {}
11impl<T> UndecoratedConflictTarget for ConflictTarget<T> {}
12
13pub trait DecoratableTarget<P> {
22 type FilterOutput;
24 fn filter_target(self, predicate: P) -> Self::FilterOutput;
68}
69
70#[derive(#[automatically_derived]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
DecoratedConflictTarget<T, U> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"DecoratedConflictTarget", "target", &self.target, "where_clause",
&&self.where_clause)
}
}Debug)]
71pub struct DecoratedConflictTarget<T, U> {
72 pub(crate) target: T,
73 pub(crate) where_clause: U,
74}
75
76impl<T, P> DecoratableTarget<P> for T
77where
78 P: Expression,
79 P::SqlType: BoolOrNullableBool,
80 T: UndecoratedConflictTarget,
81{
82 type FilterOutput = DecoratedConflictTarget<T, WhereClause<P>>;
83
84 fn filter_target(self, predicate: P) -> Self::FilterOutput {
85 DecoratedConflictTarget {
86 target: self,
87 where_clause: NoWhereClause.and(predicate),
88 }
89 }
90}
91
92impl<T, U, P> DecoratableTarget<P> for DecoratedConflictTarget<T, U>
93where
94 P: Expression,
95 P::SqlType: BoolOrNullableBool,
96 U: WhereAnd<P>,
97{
98 type FilterOutput = DecoratedConflictTarget<T, <U as WhereAnd<P>>::Output>;
99
100 fn filter_target(self, predicate: P) -> Self::FilterOutput {
101 DecoratedConflictTarget {
102 target: self.target,
103 where_clause: self.where_clause.and(predicate),
104 }
105 }
106}
107
108impl<DB, T, U> QueryFragment<DB> for DecoratedConflictTarget<T, U>
109where
110 DB: Backend,
111 Self: QueryFragment<DB, DB::OnConflictClause>,
112{
113 fn walk_ast<'b>(&'b self, pass: AstPass<'_, 'b, DB>) -> QueryResult<()> {
114 <Self as QueryFragment<DB, DB::OnConflictClause>>::walk_ast(self, pass)
115 }
116}