Cómo combino múltiples funciones usando Diesel en una mediante abstracción?

Tengo las siguientes dos funciones:

pub fn get_most_recent_eth_entry(conn: &SqliteConnection) -> Result<i32, Error> {
    let res = types::ethereum::table
        .order(types::ethereum::time.desc())
        .limit(1)
        .load::<types::ETHRecord>(&*conn);
    match res {
        Ok(x) => {
            if x.len() > 0 {
                Ok(x.get(0).unwrap().time)
            } else {
                Ok(0)
            }
        }
        Err(err) => Err(format_err!("Error here! {:?}", err)),
    }
}

pub fn get_most_recent_btc_entry(conn: &SqliteConnection) -> Result<i32, Error> {
    let res = types::bitcoin::tabl,e
        .order(types::bitcoin::time.desc())
        .limit(1)
        .load::<types::BTCRecord>(&*conn);
    match res {
        Ok(x) => {
            if x.len() > 0 {
                Ok(x.get(0).unwrap().time)
            } else {
                Ok(0)
            }
        }
        Err(err) => Err(format_err!("Error here! {:?}", err)),
    }
}

Quiero combinar ambos en una sola función. He probado algunas formas diferentes, pero

Soy bastante nuevo en RustDiesel tiene tipos extraños (o al menos eso es lo que se siente)

Cuáles son algunas formas de fusionar estas dos funciones (que difieren solo en los campostypes::ethereum yETHRecord en una función unificadaget_most_recent_entry?

Estas son las definiciones de estructura de mi base de datos (los esquemas SQL se definen de manera equivalente):

#[derive(Insertable, Queryable, Debug)]
#[table_name="bitcoin"]
pub struct BTCRecord {
    pub time: i32,
    pub market_cap: f32,
    pub price_btc: f32,
    pub price_usd: f32,
    pub vol_usd: f32,
}

y el tipo de

`types::ethereum::time` is `database::types::__diesel_infer_schema::infer_bitcoin::bitcoin::columns::time`

y el tipo de

`types::ethereum::table` is
`database::types::__diesel_infer_schema::infer_bitcoin::bitcoin::table`

Respuestas a la pregunta(1)

Su respuesta a la pregunta