rust_query/value/
into_expr.rs1use sea_query::Nullable;
2
3use crate::{
4 Expr, Lazy, Table, TableRow,
5 value::{DbTyp, EqTyp},
6};
7
8pub trait IntoExpr<'column, S> {
24 type Typ: DbTyp;
26
27 fn into_expr(self) -> Expr<'column, S, Self::Typ>;
29}
30
31impl<'column, S, T: IntoExpr<'column, S, Typ = X>, X: EqTyp> IntoExpr<'column, S> for Option<T> {
32 type Typ = Option<X>;
33 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
34 let this = self.map(|x| x.into_expr().inner);
35 Expr::adhoc(move |b| {
36 this.as_ref()
37 .map(|x| (x.func)(b))
38 .unwrap_or(<X::Sql as Nullable>::null().into())
39 })
40 }
41}
42
43impl<'column, S> IntoExpr<'column, S> for String {
44 type Typ = String;
45 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
46 Expr::adhoc(move |_| sea_query::Expr::from(self.clone()))
47 }
48}
49
50impl<'column, S> IntoExpr<'column, S> for &str {
51 type Typ = String;
52 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
53 self.to_owned().into_expr()
54 }
55}
56
57impl<'column, S> IntoExpr<'column, S> for Vec<u8> {
58 type Typ = Vec<u8>;
59 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
60 Expr::adhoc(move |_| sea_query::Expr::from(self.clone()))
61 }
62}
63
64impl<'column, S> IntoExpr<'column, S> for &[u8] {
65 type Typ = Vec<u8>;
66 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
67 self.to_owned().into_expr()
68 }
69}
70
71impl<'column, S> IntoExpr<'column, S> for bool {
72 type Typ = bool;
73 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
74 Expr::adhoc(move |_| sea_query::Expr::from(self))
75 }
76}
77
78impl<'column, S> IntoExpr<'column, S> for i64 {
79 type Typ = i64;
80 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
81 Expr::adhoc(move |_| sea_query::Expr::from(self))
82 }
83}
84impl<'column, S> IntoExpr<'column, S> for f64 {
85 type Typ = f64;
86 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
87 Expr::adhoc(move |_| sea_query::Expr::from(self))
88 }
89}
90
91impl<'column, S, T> IntoExpr<'column, S> for &T
92where
93 T: IntoExpr<'column, S> + Clone,
94{
95 type Typ = T::Typ;
96 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
97 T::into_expr(self.clone())
98 }
99}
100
101impl<'column, T: Table> IntoExpr<'column, T::Schema> for TableRow<T> {
102 type Typ = Self;
103 fn into_expr(self) -> Expr<'static, T::Schema, Self::Typ> {
104 let idx = self.inner.idx;
105
106 Expr::adhoc_promise(
107 move |_| sea_query::Expr::val(idx),
108 false, )
110 }
111}
112
113impl<'column, T: Table> IntoExpr<'column, T::Schema> for Lazy<'_, T> {
114 type Typ = TableRow<T>;
115
116 fn into_expr(self) -> crate::Expr<'column, T::Schema, Self::Typ> {
117 self.id.into_expr()
118 }
119}
120
121impl<'column, S, T: DbTyp> IntoExpr<'column, S> for Expr<'column, S, T> {
122 type Typ = T;
123 fn into_expr(self) -> Expr<'column, S, Self::Typ> {
124 self
125 }
126}