Я пытаюсь обернуть поток 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> + '_,