#future #stream #poll #docs #documented #protocols #component

component-future

实现了在 tokio 文档中记录的内部 future 协议

2 个版本

0.1.1 2019 年 10 月 24 日
0.1.0 2019 年 10 月 24 日

#1193 in 异步

每月 24 次下载
2 crates 中使用

MIT 许可

13KB
80

component-future

此 crate 实现了在 tokio 文档 中记录的内部 future 协议。

概述

如果您正在实现一个复杂的 future 或 stream,它包含许多内部 future 和 stream,那么在循环中何时是必要的,何时可以安全地返回 NotReady 等等,可能会变得难以跟踪。这提供了一个类似于现有 poll 接口的界面,但扩展到包括有关内部 future 或 stream 如何影响外部 future 或 stream 状态的额外状态。这允许您轻松地将 poll 实现拆分为多个方法,并确保它们正常交互。

概要

enum OutputEvent {
    // ...
}

struct Server {
    // ...
}

impl Server {
    fn process_thing(&self, thing: OutputEvent) {
        // ...
    }

    fn process_other_thing(&self, thing: OutputEvent) -> OutputEvent {
        // ...
    }
}

impl Server {
    const POLL_FNS:
        &'static [&'static dyn for<'a> Fn(
            &'a mut Self,
        )
            -> component_future::Poll<
            Option<OutputEvent>,
            String,
        >] = &[&Self::poll_thing, &Self::poll_other_thing];

    fn poll_thing(
        &mut self,
    ) -> component_future::Poll<Option<OutputEvent>, String> {
        let thing = component_future::try_ready!(self.some_future.poll());
        self.process_thing(thing);
        Ok(component_future::Async::DidWork)
    }

    fn poll_other_thing(
        &mut self,
    ) -> component_future::Poll<Option<OutputEvent>, String> {
        if let Some(other_future) = &mut self.other_future {
            let other_thing = component_future::try_ready!(
                other_future.poll()
            );
            let processed_thing = self.process_other_thing(other_thing);
            self.other_future.take();
            Ok(component_future::Async::Ready(Some(processed_thing)))
        }
        else {
            Ok(component_future::Async::NothingToDo)
        }
    }
}

impl futures::stream::Stream for Server {
    type Item = OutputEvent;
    type Error = String;

    fn poll(&mut self) -> futures::Poll<Option<Self::Item>, Self::Error> {
        component_future::poll_stream(self, Self::POLL_FNS)
    }
}

依赖项

~53KB