1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use serde_json;
use chrono;
use uuid;
use std::fmt;
#[cfg(feature = "postgres")] use postgres;
use expression;
use field;
use super::ToSql;
pub trait ToPredicateValue: fmt::Debug {
fn to_predicate_value(&self, ctx: &mut super::SqlContext) -> String;
}
#[cfg(feature = "postgres")]
pub trait AsPostgresValue: postgres::types::ToSql + Sized {
fn as_postgres_value(&self) -> &postgres::types::ToSql {
self
}
}
#[macro_export]
macro_rules! to_predicate_for_field {
($f:ty) => (
impl ToPredicateValue for $f {
fn to_predicate_value(&self, ctx: &mut super::SqlContext) -> String { self.to_sql(ctx) }
}
)
}
impl<T: Clone + fmt::Debug> ToPredicateValue for field::NamedField<T> {
fn to_predicate_value(&self, ctx: &mut super::SqlContext) -> String { self.to_sql(ctx) }
}
macro_rules! raw_value_to_predicate_value {
($t:ty) => (
#[cfg(feature = "postgres")]
impl AsPostgresValue for $t {}
impl ToPredicateValue for $t {
fn to_predicate_value(&self, ctx: &mut super::SqlContext) -> String {
ctx.hold(Box::new(self.clone()))
}
}
)
}
raw_value_to_predicate_value!(bool);
raw_value_to_predicate_value!(i8);
raw_value_to_predicate_value!(i16);
raw_value_to_predicate_value!(i32);
raw_value_to_predicate_value!(i64);
raw_value_to_predicate_value!(f32);
raw_value_to_predicate_value!(f64);
raw_value_to_predicate_value!(String);
raw_value_to_predicate_value!(Vec<u8>);
raw_value_to_predicate_value!(serde_json::Value);
raw_value_to_predicate_value!(chrono::NaiveDateTime);
raw_value_to_predicate_value!(uuid::Uuid);
impl ToPredicateValue for expression::RawExpression {
fn to_predicate_value(&self, _ctx: &mut super::SqlContext) -> String {
self.content.to_string()
}
}
macro_rules! extended_impl {
($t:ty) => (
impl ToSql for $t { fn to_sql(&self, ctx: &mut super::SqlContext) -> String { self.to_predicate_value(ctx) } }
impl ToSql for Option<$t> { fn to_sql(&self, ctx: &mut super::SqlContext) -> String { self.to_predicate_value(ctx) } }
impl ToPredicateValue for Option<$t> {
fn to_predicate_value(&self, ctx: &mut super::SqlContext) -> String {
match self {
&Some(ref predicate) => predicate.to_predicate_value(ctx),
&None => "NULL".to_string()
}
}
}
)
}
extended_impl!(bool);
extended_impl!(i8);
extended_impl!(i16);
extended_impl!(i32);
extended_impl!(i64);
extended_impl!(f32);
extended_impl!(f64);
extended_impl!(String);
extended_impl!(Vec<u8>);
extended_impl!(serde_json::Value);
extended_impl!(chrono::NaiveDateTime);
extended_impl!(uuid::Uuid);
extended_impl!(expression::RawExpression);
impl<T: ToPredicateValue> ToPredicateValue for Vec<T> {
fn to_predicate_value(&self, ctx: &mut super::SqlContext) -> String {
let values: Vec<String> = self.iter().map(|v| v.to_predicate_value(ctx)).collect();
values.join(", ")
}
}
impl<T: ToPredicateValue> ToSql for Vec<T> {
fn to_sql(&self, ctx: &mut super::SqlContext) -> String {
self.to_predicate_value(ctx)
}
}