I have 3 tables. They all have the same field and structure.
CREATE TABLE "wilko"
(
"id" serial primary key,
"public_id" integer NOT NULL
);
In my rust code, I want to write generic function that gets wilko
by public_id
. Here is what I have
use diesel::query_dsl::filter_dsl::FilterDsl;
use diesel::query_dsl::methods::LimitDsl;
use diesel::sql_types::{Bool, Integer, SingleValue, SqlType, Text};
use diesel::{dsl, Column, Expression, Table, TextExpressionMethods, PgConnection};
use serde::{Deserialize, Serialize};
#[derive(
diesel::Queryable,
diesel::Identifiable,
diesel::Selectable,
Debug,
PartialEq,
Deserialize,
Serialize,
Clone,
)]
#[diesel(table_name = crate::schema::wilko)]
pub struct Wilko {
pub id: i32,
pub public_id: i32,
}
pub async fn get_wall<T, C, R: Send>(
table: T,
column: C,
public_key: String,
mut conn: PgConnection,
) -> R
where
T: Table + FilterDsl<dsl::Eq<C, Integer>>,
C: Column + Expression<SqlType = Integer>,
dsl::Filter<T, dsl::Eq<C, Integer>>: LimitDsl,
<T as FilterDsl<dsl::Eq<C, Integer>>>::Output: Serialize,
{
Ok(diesel_async::RunQueryDsl::get_result::<Wilko>(
table.filter(column.eq(public_key)),
&mut conn,
)
.await.unwrap())
}
I know I'm almost there, just need to get pointed in right direction. Thanks
Error
error[E0275]: overflow evaluating the requirement `<<T as AsQuery>::Query as FilterDsl<diesel::expression::grouped::Grouped<diesel::expression::operators::Eq<C, Integer>>>>::Output == _`
--> src/endpoints/mod.rs:15:1
|
15 | / pub async fn get_wall<T, C, R: Send>(
16 | | table: T,
17 | | column: C,
18 | | public_id: i32,
... |
23 | | C: Column + Expression<SqlType = Integer>,
24 | | <T as FilterDsl<dsl::Eq<C, Integer>>>::Output: Serialize,
| |_____________________________________________________________^
Helpful links