1pub trait SqlForgeValidatorValue<Expected> {
2 fn sql_forge_validator_value(&self) -> Expected;
3}
4
5macro_rules! impl_identity_validator_value {
6 ($($ty:ty),* $(,)?) => {
7 $(
8 impl SqlForgeValidatorValue<$ty> for $ty {
9 fn sql_forge_validator_value(&self) -> $ty {
10 self.clone()
11 }
12 }
13 )*
14 };
15}
16
17impl_identity_validator_value!(
18 i8,
19 i16,
20 i32,
21 i64,
22 isize,
23 u8,
24 u16,
25 u32,
26 u64,
27 usize,
28 f32,
29 f64,
30 bool,
31 String,
32 Vec<u8>
33);
34
35impl<'a> SqlForgeValidatorValue<&'a str> for &'a str {
36 fn sql_forge_validator_value(&self) -> &'a str {
37 self
38 }
39}
40
41impl<T, Expected> SqlForgeValidatorValue<Expected> for &T
42where
43 T: SqlForgeValidatorValue<Expected>,
44{
45 fn sql_forge_validator_value(&self) -> Expected {
46 <T as SqlForgeValidatorValue<Expected>>::sql_forge_validator_value(*self)
47 }
48}
49
50impl<T, U> SqlForgeValidatorValue<Option<U>> for Option<T>
51where
52 T: SqlForgeValidatorValue<U>,
53{
54 fn sql_forge_validator_value(&self) -> Option<U> {
55 self.as_ref().map(|value| value.sql_forge_validator_value())
56 }
57}
58
59pub fn sql_forge_validator_value<Expected, T>(value: &T) -> Expected
60where
61 T: SqlForgeValidatorValue<Expected>,
62{
63 <T as SqlForgeValidatorValue<Expected>>::sql_forge_validator_value(value)
64}
65
66pub trait SqlForgeQuery<Output> {
67 type Db: sqlx::Database;
68
69 fn fetch_all<'e, E>(
70 self,
71 executor: E,
72 ) -> impl std::future::Future<Output = Result<Vec<Output>, sqlx::Error>> + Send + 'e
73 where
74 Self: Sized + 'e,
75 E: sqlx::Executor<'e, Database = Self::Db> + Send + 'e,
76 Self::Db: 'e;
77
78 fn fetch_one<'e, E>(
79 self,
80 executor: E,
81 ) -> impl std::future::Future<Output = Result<Output, sqlx::Error>> + Send + 'e
82 where
83 Self: Sized + 'e,
84 E: sqlx::Executor<'e, Database = Self::Db> + Send + 'e,
85 Self::Db: 'e;
86
87 fn fetch_optional<'e, E>(
88 self,
89 executor: E,
90 ) -> impl std::future::Future<Output = Result<Option<Output>, sqlx::Error>> + Send + 'e
91 where
92 Self: Sized + 'e,
93 E: sqlx::Executor<'e, Database = Self::Db> + Send + 'e,
94 Self::Db: 'e;
95
96 fn execute<'e, E>(
97 self,
98 executor: E,
99 ) -> impl std::future::Future<
100 Output = Result<<Self::Db as sqlx::Database>::QueryResult, sqlx::Error>,
101 > + Send
102 + 'e
103 where
104 Self: Sized + 'e,
105 E: sqlx::Executor<'e, Database = Self::Db> + Send + 'e,
106 Self::Db: 'e;
107}
108
109pub trait SqlForgeQueryExecute {
110 type Db: sqlx::Database;
111
112 fn execute<'e, E>(
113 self,
114 executor: E,
115 ) -> impl std::future::Future<
116 Output = Result<<Self::Db as sqlx::Database>::QueryResult, sqlx::Error>,
117 > + Send
118 + 'e
119 where
120 Self: Sized + 'e,
121 E: sqlx::Executor<'e, Database = Self::Db> + Send + 'e,
122 Self::Db: 'e;
123}
124
125pub trait SqlForgeQueryGroup {
126 type Db: sqlx::Database;
127}
128
129pub trait SqlForgeQueryGroupGet<Key, Output>: SqlForgeQueryGroup {
130 type Query: SqlForgeQuery<Output, Db = Self::Db>;
131
132 fn get(self, _: Key) -> Self::Query;
133}