Есть такая функция написанная на actix-web:
#[get("/")]
async fn get_list(
pool: web::Data<DatabasePool>,
list: web::Json::<List>
) -> Result<HttpResponse, ApiError> {
use schema::users::dsl::*;
process_request!(get_list, users, Users, pool, list.0)
}
она принимает лист List такого вида
#[derive(Deserialize)]
pub struct List {
pub offset: Option<i64>,
pub limit: Option<i64>,
pub sort_by: Option<SortBy>,
pub filters: Option<HashMap<String, serde_json::Value>>
}
далее в макросе process_request у нас запускается макрос get list, который применяет offset, limit, sort_by, но как приминить filter, я писал такой макрос для этого, но ничего не вышло:
macro_rules! make_filter {
($query:expr, $filters:expr) => {
$query = match &$filters {
Some(filter) => {
let mut query = $query;
for (key, value) in filter {
query = query.filter(diesel::dsl::sql(&format!(r#""{}"{}"#, key, value)));
}
query
},
_ => $query
};
};
}
нужна аннотация типов, как это сделать? у меня много таблиц и в каждой много полей с разным типами данных, я хочу чтобы у меня был универсальный макрос который мог обрабатывать все фильтры для всех таблиц.