Skip to main content

sql_forge/
traits.rs

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}