Accept diesel table and column as argument

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

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.