#future #async #no-std

no-std named-future-proc-macros

给你的 Future 起个名字!

3 个不稳定版本

0.1.0-pre.12023年4月25日
0.0.2 2023年4月25日
0.0.1 2023年4月22日

169#futures

每月 31 下载
用于 named-future

Apache-2.0 WITH LLVM-exception

25KB
443

named-future: 给你的 Future 起个名字!

GitHub Workflow Status Crates.io Minimum supported Rust version: 1.65 License: Apache-2.0 WITH LLVM-exception

Future 包装在一个有大小(sized)的结构体中,这样它就可以在 traits 中使用,或者作为返回类型,而无需使用 Box<>dyn …impl

这是一个直到 #![feature(type_alias_impl_trait)] 稳定之前的一个简单解决方案

/// A slow multiplication
///
/// # Struct
///
/// Future generated by [`slow_mul`]
#[named_future]
pub async fn slow_mul(factor1: u32, factor2: u32) -> u32 {
    sleep(Duration::from_secs(5)).await;
    factor1 * factor2
}

扩展为

/// A slow multiplication
pub fn slow_mul(factor1: u32, factor2: u32) -> SlowMul {
    ...
}

/// Future generated by [`slow_mul`]
pub struct SlowMul {
    ...
}

impl Future for SlowMul {
    type Output = u32;

    #[inline]
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
        ...
    }
}

此外,它还将实现一个 Drop,以便被丢弃的 future 可以正常工作,并为您的方便实现 Debug

proc_macro #[named_future] 有以下可选参数

  • #[named_future(Send)]

    • 为生成的 struct 实现 Send。目前无法自动检测结构体是否应该实现 Send,因此您必须手动请求实现。即使如此,也确保 Future 可以发送,否则编译将失败。
  • #[named_future(Sync)]

    • 为生成的 struct 实现 Sync。请参阅 Send 的说明。
  • #[named_future(type = Name)]

    • 默认名称之外,即使用函数名的Pascal大小写,您可以使用此参数覆盖名称。您还可以使用此参数覆盖 struct 的可见性:type = pub Name。默认情况下,函数的可见性会被复制。
  • #[named_future(crate = some::path)]

    • 如果您已将依赖项在您的 Cargo.toml 中重命名,例如 renamed = { package = "named-future", version = "0.0.1" },那么您必须指定其名称/路径。默认为 ::named_future

要为您的函数和生成的结构体添加文档,您可以使用一行 /// # Struct 将这两个部分分开。

库代码可以与 #![no_std] 一起使用。

由于Rust的限制,目前无法为泛型函数实现“命名future”:错误:“在匿名常量中目前不允许泛型 Self 类型”。

受到Jun Ryung Ju先前工作的启发:rename-future

依赖项

~0.3–0.8MB
~19K SLoC