#future #impl #union #index #macro #type #branch

future-union

使用 implFuturefutures::future::Either

2 个版本

0.1.1 2019年4月13日
0.1.0 2019年4月13日

Rust 模式 中排名第 2136

MIT/Apache

15KB
222 行代码(不含注释)

未来联合

当你使用 impl 特性,特别是与 futures 一起使用时,有时你将需要一个分支表达式(例如 ifmatch),其中不同的分支返回不同的类型,这些类型都实现了 Future。由于当前稳定版 Rust 中 impl 特性只能引用一个类型,所以这不起作用。

解决这个问题的一个方案是使用 futures::future::Either 将所有不同的可能 futures 组合到一个类型中返回。手动这样做真的很麻烦,并且在改变可能分支的数量时需要大量更改。

这个宏 future_union 自动执行此操作。目前你仍然必须保持每个函数的总数,以及索引(从 0 开始)。如果这些值不准确,那么你将得到可怕的类型错误。

示例

use futures::future::{self, Future};
use future_union::future_union;

fn impl_demo(n: usize) -> impl Future<Item=(), Error=()> {
    match n {
        0 => future_union!(3, 0, future::ok(())),
        1 => future_union!(3, 1, future::ok(()).map(|_| ())),
        _ => future_union!(3, 2, future::ok(()).map(|_| ()).map(|_| ())),
    }
}

未来计划

  • 支持 futures-0.3
  • 实现一个函数属性宏,该宏检测给定函数中的 future_union 调用,并自动添加正确的计数和索引,例如:
    use futures::future::{self, Future};
    use future_union::*;
    
    #[future_union_fn]
    fn impl_demo(n: usize) -> impl Future<Item=(), Error=()> {
        match n {
            0 => future_union_auto!(future::ok(())),
            1 => future_union_auto!(future::ok(()).map(|_| ())),
            _ => future_union_auto!(future::ok(()).map(|_| ()).map(|_| ())),
        }
    }
    

欢迎贡献!

许可证

许可如下:

任选其一。

贡献

除非你明确声明,否则任何有意提交以包含在你提交的工作中的贡献,如 Apache-2.0 许可证中定义的,应按上述方式双许可,不附加任何额外条款或条件。

依赖关系

约 2MB
约 46K SLoC