Rust 从AsyncRead转发到futures 0.3 mpsc::UnboundedSender时的错误处理<;T>;

Rust 从AsyncRead转发到futures 0.3 mpsc::UnboundedSender时的错误处理<;T>;,rust,rust-tokio,Rust,Rust Tokio,我想将实现tokio::process::child::ChildStdout的tokio::io::AsyncRead的输出转发到实现futures::channel::mpsc::UnboundedSender的futures::sink::sink 我使用的是一个定制的编解码器,它可以生成MyType的项目,但是为了保持MRE中的M的真实性,我将使用Tokio的LinesCodec并对这个问题说MyType=String 使用期货::流文本;//0.3.8 使用tokio;//1.0.1

我想将实现
tokio::process::child::ChildStdout
tokio::io::AsyncRead
的输出转发到实现
futures::channel::mpsc::UnboundedSender
futures::sink::sink

我使用的是一个定制的编解码器,它可以生成
MyType
的项目,但是为了保持MRE中的M的真实性,我将使用Tokio的
LinesCodec
并对这个问题说
MyType=String

使用期货::流文本;//0.3.8
使用tokio;//1.0.1
使用tokio_util;//0.6.0
#[tokio::main]
发布异步fn main(){
let(mut-tx,rx)=未来::通道::mpsc::无界::();
让mut process=tokio::process::Command::new(“dmesg”)
.arg(“-w”)
.stdout(std::process::Stdio::piped())
.spawn()
.unwrap();
让stdout=process.stdout.take().unwrap();
让codec=tokio_util::codec::LinesCodec::new();
让framed_read=tokio_util::codec::FramedRead::new(stdout,codec);
向前传输=帧化读取向前传输(tx);
//从通道的另一端读取
东京:产卵(异步移动){
而让一些(行)=rx.next()等待{
eprintln!(“{}”,行);
}
});
//向前,等待;
}
但是,编译器报告错误类型不匹配:

error[E0271]:类型不匹配解析“::error==linescodecorr`
-->src/main.rs:19:31
|
19 |向前传输=帧化|读取向前传输(tx);
|^^^^应为结构“futures::channel::mpsc::SendError”,找到枚举“LinesCodeError”`
假设我在这里没有做一些根本错误的事情,我如何正确地处理/转换这些错误类型


似乎出现了一个错误,但它似乎是针对相反的情况和futures 0.1,我怀疑它可能已经过时,因为Rust的异步生态系统中的情况变化如此之快。

流中的项目可能会失败(
LinesCodeError
),而将值发送到通道可能会失败(
SendError
),但整个转发过程只能导致一种错误类型

您可以使用和将错误转换为兼容的统一类型。在这里,我选择了

类型错误=Box;
向前发送=加框读取。错误插入:()。向前发送(tx.sink\u err\u插入:());
在许多情况下,您会创建自定义错误类型。您可能也不需要像上面的示例那样使用turbofish,因为类型推断可能会在某个时候起作用

另见: