如何优化rust [duplicate]中的multi-unwrap code语句

sg2wtvxw  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(139)

此问题已在此处有答案

What is the idiomatic way to handle/unwrap nested Result types?(2个答案)
14小时前关闭
我正在学习使用rust v1.65.0发送http请求。现在我有一个像这样的rust代码块:

pub async fn get_queue_cv() {
    let client = Client::new();
    let url_path = "/cv/gen/v1/list";
    let url = format!("{}{}", get_app_config("cv.cv_api_url"), url_path);
    let response = client
        .post(url)
        .headers(construct_headers())
        .body("{}")
        .send()
        .await;
    match response {
        Ok(r) => {
            let r: serde_json::Value = r.json().await.unwrap();
            match r.get("result") {
                Some(_) => {},
                None => {},
            }
            let result: &serde_json::Value = r.get("result").unwrap();
            let first_element = result.get(0).unwrap();
            let queue_record: CvGen = serde_json::from_value(first_element.clone()).unwrap();
            let tpl_resp = get_template(queue_record);
            tpl_resp.await;
        }
        Err(e) => println!("Error: {}", e),
    }
}

这段代码工作正常,但有时当服务器返回null结果时,解包会出现异常。现在我想处理解包失败的情况,我试图使用匹配,但现在我发现使用匹配使代码有太多的嵌套层次和maket代码丑陋。我想要的只是简单地返回,如果任何unwrap失败。我试过unwrap_or_else,但我不知道如何定义else条件。我该怎么做才能用更好的方法处理这个拆封?

o8x7eapl

o8x7eapl1#

你可以通过下面的Option方法来尝试一个“Maybe”monad方法:

  • https://doc.rust-lang.org/std/option/enum.Option.html#method.map
  • https://doc.rust-lang.org/std/option/enum.Option.html#method.inspect(NIGHTLY
let responce = r.get("result")
  .map(|x| x.get(0))
  .map(|x| serde_json::from_value(x.clone()))
  .map(|x| get_template(x));
match responce {
  Some(awaiter) => awaiter.await
  None => // TODO: your implementation
}

相关问题