【问题标题】:is it possible to use enum to parse the request in rust rocket是否可以使用枚举来解析 rust Rocket 中的请求
【发布时间】:2022-01-18 03:40:15
【问题描述】:

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

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))
    }
}

但函数需要的参数是枚举,这是火箭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时,似乎服务器端没有理解客户端请求,我应该如何使用枚举来接收客户端请求?可能吗?或者我应该如何调整条件查询功能以使其工作?

【问题讨论】:

    标签: rust rust-diesel rust-rocket


    【解决方案1】:

    我将匹配数据类型从 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))
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 2013-03-22
      • 2016-08-31
      • 2015-05-16
      • 2011-05-31
      • 2014-07-31
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      相关资源
      最近更新 更多