rust 无法从reqwest创建的流中的“try_for_each_concurrent”返回错误

rryofs0p  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(119)

我是rust新手,所以,也许有一种我不知道的方法可以做到这一点,但是,如果我把一个reqwest::Body转换成一个流并调用,例如,try_for_each_concurrent,流的Error类型是reqwest::Error,所以,我期望在闭包中返回该类型的东西,但是在reqwest本身之外,构造一个reqwest::Error是不可能的。
例如:

let mut stream = reqwest::get("http://httpbin.org/ip")
    .await?
    .bytes_stream();
let result = stream.try_for_each_concurrent(2, |c| async move {
  // This cannot work:
  let transformed = some_function_that_can_return_another_kind_of_error(c)?;
  // And there's no way to convert into a `reqwest::Error`, AFAIK
});

由于类型超出了我的控制范围,我的另一个想法是创建一个流来使用来自reqwest的流,但似乎找不到一个简单的方法来做到这一点。是否有一个正确的/惯用的方法来处理这种情况,我不知道?
谢谢你的帮助!

8i9zcol2

8i9zcol21#

我想我找到了这个问题的解决方案。你需要在调用try_for_each_concurrent之前转换err类型。

let mut stream = reqwest::get("http://httpbin.org/ip")
    .await?
    .bytes_stream();
let result = stream.err_into::<Your Error>()
    .try_for_each_concurrent(2, |c| async move {
let transformed = some_function_that_can_return_another_kind_of_error(c)?;

因此,如果“another_kind_of_error”实现为YourError类型,则它应该按原样工作。如果没有,则可以使用

let transformed = some_function_that_can_return_another_kind_of_error(c).
    map_err(|e| { conversion })?

所以在这种情况下,你的lambda可以返回底层的reqwest::Error和你自己打包到 Package 器枚举错误YourError中的错误。我已经使用了thiserror::Error来摆脱制作这个 Package 器错误枚举的样板。

相关问题