Rust 基于条件如何将输出分配给匹配类型的变量

Rust 基于条件如何将输出分配给匹配类型的变量,rust,rust-tokio,Rust,Rust Tokio,我想修改一个上载异步文件的库,以便它可以在迭代中“公开”或“通知”,我的目标是防止直接从库中“打印/写入”,而是从使用库的方法中执行,以便通过使用“公开”数据,他们可以做些什么。我用于在每次交互中测试任务的代码是: use futures::stream::TryStreamExt; use tokio_util::codec::{BytesCodec, FramedRead}; let stream = FramedRead::new(file, BytesCodec::new())

我想修改一个上载异步文件的库,以便它可以在迭代中“公开”或“通知”,我的目标是防止直接从库中“打印/写入”,而是从使用库的方法中执行,以便通过使用“公开”数据,他们可以做些什么。我用于在每次交互中测试任务的代码是:

use futures::stream::TryStreamExt;
use tokio_util::codec::{BytesCodec, FramedRead};

let stream = FramedRead::new(file, BytesCodec::new())
    .inspect_ok(|chunk| {
        // do X with chunk...
    });

// reqwest
let body = Body::wrap_stream(stream);
client.put(url).body(body)
我正在考虑使用一个通道来“共享状态”(如果可以这样调用),这样,如果我收到一个
发送方
作为参数,我就可以向它写入,并且从调用的方法中,使用
接收方
来做一些事情(例如显示进度条),这就是我正在尝试的:

use tokio::sync::mpsc; 

fn upload(file: String, sender: Option<mpsc::Sender<usize>) {
    let stream = if let Some(mut tx) = sender {
        FramedRead::new(file, BytesCodec::new()).inspect_ok(move |chunk|
             tx.send(chunk.len())
        )
    } else {
        FramedRead::new(file, BytesCodec::new())
    };

    // reqwest
    let body = Body::wrap_stream(stream);
    client.put(url).body(body)
    let body = Body::wrap_stream(stream);
}
我还尝试:

let stream = FramedRead::new(file, BytesCodec::new());

if let Some(mut tx) = sender {
    stream.inspect_ok(move |chunk|
         tx.send(chunk.len())
    );
}
但是获取不匹配的类型

如何实现这一点?有更好的渠道吗

例如,我想使用类似于以下内容的板条箱:

use tokio::sync::mpsc;
use indicatif::ProgressBar;  
use mylibrary::upload; 

let (mut tx, mut rx) = mpsc::channel(100);

let bar = ProgressBar::new(1000);
 
// here pass the sender so that in the receiver i could increment the progress bar
let response = upload("file", Some(tx));

while let Some(i) = rx.recv().await {
   bar.inc(1);
}

bar.finish();

if
中生成主体,以便双臂具有类型
主体

use tokio::sync::mpsc;

fn upload(file: String, sender: Option<mpsc::Sender<usize>) {
    let stream = FramedRead::new(file, BytesCodec::new());

    let body = if let Some(mut tx) = sender {
        Body::wrap_stream(stream
            .inspect_ok(move |chunk| tx.send(chunk.len()))
        )
    } else {
        Body::wrap_stream(stream)
    };

    // not sure where `client` or `url` are defined?
    client.put(url).body(body)
}
使用tokio::sync::mpsc;

fn upload(file:String,sender:option)我的想法是为
发送者提供一个选项,如果有
只需上传
让body=body::wrap_流(stream);
使用库的“开发者”如果想要获得“状态”,应该作为参数传递
Some(sender)
也许有更好的方法可以做到这一点,任何建议都是非常受欢迎的:-)或者,如果让
表达式进入,请将这两个流包装在
的分支中。如果左侧和右侧类型使用相同的项目类型实现
,则
枚举实现
特征。
use tokio::sync::mpsc;

fn upload(file: String, sender: Option<mpsc::Sender<usize>) {
    let stream = FramedRead::new(file, BytesCodec::new());

    let body = if let Some(mut tx) = sender {
        Body::wrap_stream(stream
            .inspect_ok(move |chunk| tx.send(chunk.len()))
        )
    } else {
        Body::wrap_stream(stream)
    };

    // not sure where `client` or `url` are defined?
    client.put(url).body(body)
}
use tokio::sync::mpsc;
use futures::future::Either;

fn upload(file: String, sender: Option<mpsc::Sender<usize>) {
    let stream = FramedRead::new(file, BytesCodec::new());

    let stream = if let Some(mut tx) = sender {
        Either::Left(stream
            .inspect_ok(move |chunk| tx.send(chunk.len()))
        )
    } else {
        Either::Right(stream)
    };

    let body = Body::wrap_stream(stream);

    // not sure where `client` or `url` are defined?
    client.put(url).body(body)
}