gpt4 book ai didi

rust - 使用超 crate 体作为“ future crate 流”参数

转载 作者:行者123 更新时间:2023-12-03 11:30:25 24 4
gpt4 key购买 nike

使用hyper crate,我向端点发出了HTTP请求,然后尝试将响应主体传递给期望参数为Futures crate Stream的第三方库。
这导致类型错误。
Cargo.toml

[dependencies]
bytes = "1.0.1"
http = "0.2.3"
tokio = { version = "1.1.0", features = ["full"] }
hyper = { version = "0.14.2", features = ["full"] }
hyper-tls = "0.5.0"
futures = "0.3.12"
示例
use std::io;
use bytes::Bytes;
use hyper::{Client, Body};
use hyper_tls::HttpsConnector;
use http::Request;
use futures::stream::Stream;

// ---- begin third-party library
type ConsumableStream = dyn Stream<Item = Result<Bytes, io::Error>> + Send + Sync + 'static;
async fn stream_consumer(_: &mut ConsumableStream) {
// consume stream...
}
// ---- end third-party library

#[tokio::main]
async fn main() {
let uri = "https://jsonplaceholder.typicode.com/todos/1";
let https = HttpsConnector::new();
let client = Client::builder().build::<_, Body>(https);
let request = Request::get(uri).body(Body::empty()).unwrap();
let response = client.request(request).await.unwrap();
let mut body = Box::new(response.into_body());
stream_consumer(&mut body).await;
}
cargo 运行输出
error[E0271]: type mismatch resolving `<std::boxed::Box<hyper::body::body::Body> as futures_core::stream::Stream>::Item == std::result::Result<bytes::bytes::Bytes, std::io::Error>`
--> src/bin/future_streams.rs:24:21
|
24 | stream_consumer(&mut body).await;
| ^^^^^^^^^ expected struct `std::io::Error`, found struct `hyper::error::Error`
|
= note: expected enum `std::result::Result<_, std::io::Error>`
found enum `std::result::Result<_, hyper::error::Error>`
= note: required for the cast to the object type `(dyn futures_core::stream::Stream<Item = std::result::Result<bytes::bytes::Bytes, std::io::Error>> + std::marker::Send + std::marker::Sync + 'static)`

error: aborting due to previous error; 1 warning emitted

For more information about this error, try `rustc --explain E0271`.
error: could not compile `rustest`.

To learn more, run the command again with --verbose.
问题
将 super 实体与预期的 future 流类型的功能参数一起使用的最有效方法是什么?

最佳答案

ConsumableStream需要一个Result<Bytes, io::Error>,但是client.request返回一个Result<Bytes, hyper::Error>。如果ConsumableStream来自第三方库,并且您不能更改类型定义,则可以映射结果流:

use futures::TryStreamExt;
use std::io;

#[tokio::main]
async fn main() {
// ...
let body = response
.into_body()
.map_err(|e| io::Error::new(io::ErrorKind::Other, e));
stream_consumer(&mut Box::new(body)).await;
}

关于rust - 使用超 crate 体作为“ future crate 流”参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65877520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com