Неожиданный тип возврата с фьючерсами в контексте TryStream и SNAFU - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь обернуть поток INotify Event s, и я не очень успешен:

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 он становится Result<EventStream, Error>, но EventStream определяется как Stream<ioResult<Event>>, что эквивалентно (по моему мнению оптимиста) 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> + '_,

1 Ответ

0 голосов
/ 23 марта 2020

Ok вместо Item в TryStream решит проблему. Doh!

...