named-future: Give your Future a name!

Wrap a [Future] in a sized struct, so it can be use in traits, or as return type, without the need for [Box<…>], [dyn …], or [impl …].

``rust,untested /// A slow multiplication /// /// # Struct /// /// Future generated by [slow_mul`]

[named_future]

pub async fn slowmul(factor1: u32, factor2: u32) -> u32 { sleep(Duration::fromsecs(5)).await; factor1 * factor2 } ```

Expands to

```rust,untested /// 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> {
    ...
}

} ```

Additionally it will implement a Drop, so a dropped future will work fine, and Debug for your convenience.

The proc_macro #[named_future] has the following optional arguments:

To add a documentation to your function, and the generated struct, you can separate both sections with a line /// # Struct

The library code can be used with #![no_std].

Because of limitations in rust, it is currently not possible to implement a “named future” for generic functions: “error: generic Self types are currently not permitted in anonymous constants”.