是否可以在rust-rocket中使用enum来解析请求



我想在防锈柴油(diesel = { version = "1.4.7", features = ["postgres","64-column-tables","chrono"] }(中进行条件查询。从这里阅读文档并编写如下函数:

fn find_channel(request: &ChannelRequest) -> Box<dyn BoxableExpression<crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::table, DB, SqlType=Bool> + '_> {
use crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::dsl::*;
match request {
ChannelRequest::editorPick(editorPick) => Box::new(crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::dsl::editor_pick.eq(editorPick)),
_ => Box::new(crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::dsl::editor_pick.eq(0))
}
}

但需要参数的函数是enum,这是火箭rocket = { version = "0.5.0-rc.1", features = ["json"] }:中定义的ChannelRequest

use rocket::serde::Deserialize;
use rocket::serde::Serialize;
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
#[allow(non_snake_case)]
pub enum ChannelRequest {
userId(Option<i64>),
pageNum(Option<i64>),
pageSize(Option<i64>),
editorPick(Option<i32>),
}

这是火箭api控制器定义的:

#[post("/v1/page", data = "<request>")]
pub fn page(request: Json<ChannelRequest>) -> content::Json<String> {
let channels = channel_query::<Vec<RssSubSource>>(&request);
return box_rest_response(channels);
}

这是调用条件查询的channel_query

pub fn channel_query<T>(request: &Json<ChannelRequest>) -> PaginationResponse<Vec<RssSubSource>> {
use crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::dsl::*;
let connection = config::establish_connection();
let query = rss_sub_source
.filter(find_channel(&request.0))
.order(created_time.desc())
.paginate(1)
.per_page(10);
let query_result: QueryResult<(Vec<_>, i64, i64)> = query.load_and_count_pages_total::<RssSubSource>(&connection);
let page_result = map_pagination_res(
query_result,
1,
10);
return page_result;
}

当我请求频道搜索api时,服务器端似乎不理解客户端请求,我应该如何使用enum来接收客户端请求?有可能吗?或者我应该做些什么来调整条件查询函数使其工作?

我将匹配数据类型从enum调整为struct,将enum更改为strunct:

use rocket::serde::Deserialize;
use rocket::serde::Serialize;
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
#[allow(non_snake_case)]
pub struct ChannelRequest {
pub userId: Option<i64>,
pub pageNum: Option<i64>,
pub pageSize: Option<i64>,
pub editorPick: Option<i32>
}

并像这样调整条件查询:

fn find_channel(request: &ChannelRequest) -> Box<dyn BoxableExpression<crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::table, DB, SqlType=Bool> + '_> {
use crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::dsl::*;
match request {
ChannelRequest { editorPick, .. } => Box::new(crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::dsl::editor_pick.eq(editorPick)),
_ => Box::new(crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::dsl::editor_pick.eq(0))
}
}

最新更新