#future #branch #machines #explicit #state #state-machine #construction

union-future

宏,允许轻松构建由分支产生的显式 Future 状态机

2 个版本

使用旧的 Rust 2015

0.1.1 2016 年 12 月 27 日
0.1.0 2016 年 12 月 27 日

#15#machines

MIT 许可证

10KB
84

联合未来

在编写异步代码时,使用令人惊叹的 futures 库,有时需要编写分支代码。例如,您的代码可能在某些时候有立即答案 some,在这种情况下,您希望返回一个立即解决的 future,或者如果无法立即得到答案,可能需要调用数据库。

教程 中所述,对于这种情况有多种选择,其中最受欢迎的是创建一个 BoxedFuture。这种方法的缺点包括运行时分配 trait 对象。由于 future trait 有一个几乎鼓励这种方法的 .boxed() 方法,因此这种方法很受欢迎。

然而,在性能要求高的场景或公开库时,显式状态机是构建 future 的首选方法。这个库使得编写既高效又易用的代码变得简单。

#[macro_use]
extern crate union_future;
extern crate futures;

use futures::*;
use futures::future::*;

// Macro will create the enum and necessary trait implementations
// for the QueryFuture. This enum will have 2 variants: Cached and Db.
union_future!(QueryFuture<u64, DbError>,
      Cached => FutureResult<u64, DbError>,
      Db => DbQueryFuture<u64>);

// Example code that branches, using the future created by the macro
pub fn query(db: &Db, key: &str) -> QueryFuture {
    if let Some(cached_val) = check_local_cache(key) {
        QueryFuture::Cached(ok(cached_val))
    } else {
        query_db(db, key).into()
    }
}

fn check_local_cache(key: &str) -> Option<u64> {
    // ...
}

fn query_db(db: &Db, key: &str) -> DbQueryFuture<u64> {
    // ...
}

安装

首先,将以下内容添加到您的 Cargo.toml

[dependencies]
union-future = "0.1"
futures = "0.1"

依赖项

~53KB