2 个版本
0.1.1 | 2019 年 10 月 24 日 |
---|---|
0.1.0 | 2019 年 10 月 24 日 |
#1193 in 异步
每月 24 次下载
在 2 crates 中使用
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