首页 > 解决方案 > 具有期货 TryStream 和 SNAFU 上下文的意外返回类型

问题描述

我正在尝试包装一个 INotify 流,但Event我不是很成功:

pub fn doc_stream(
    &mut self,
) -> Result<impl TryStream<Item = Event<std::ffi::OsString>, Error = Error> + '_, Error> {
    Inotify::init()
        .and_then(|mut inotify| {
            inotify
                .add_watch(
                    self.path.clone(),
                    WatchMask::MODIFY | WatchMask::CREATE | WatchMask::DELETE,
                )
                .map(|_| inotify)
        })
        .context(INotifyError)
        .and_then(move |mut inotify| {
            inotify
                .event_stream(&mut self.buffer[..])
                .context(INotifyError)
                .map(|ts| ts.context(INotifyError))
        })
}

在这个函数快结束时,我有一个inotify.event_stream(...)返回类似Result<EventStream, ioError>. 随着对 的调用context,它变成了 a Result<EventStream, Error>,但 anEventStream被定义为 a Stream<ioResult<Event>>,它(在我的乐观主义者看来)等同于 a TryStream<Event, ioError>

之后context(),我期望有Result<TryStream<Event, ioError>, Error>。随着对 的调用.map(|ts| ts.context(INotifyError)),我现在希望把它变成一个Result<TryStream<Event, Error>, Error>,但它不是....我有一个Result太多的层:Result<TryStream<Result<Event, Error>, Error>, Error>

我怀疑从 的变化Stream<Result<Foo, _>>不会变成TryStream<Foo, _>,而是变成TryStream<Result<Foo, _>, _>,但我不确定......


经过一番调查,我将问题缩小到这个:

inotify.event_stream(...)

返回验证

impl Stream<Item = Result<Event<std::ffi::OsString>, io::Error>> + '_,

但不验证

impl TryStream<Item = Event<std::ffi::OsString>, Error = io::Error> + '_,

标签: ruststreaminotify

解决方案


Ok而不是Item在 TryStream 中将解决问题。嗬!


推荐阅读