Crate async_recursion
source ·Expand description
async-recursion macro
Procedural macro for recursive async functions.
- Documentation
- Cargo package: async-recursion
Motivation
Consider the following recursive implementation of the fibonacci numbers:
ⓘ
async fn fib(n : u32) -> u32 {
   match n {
       0 | 1 => 1,
       _ => fib(n-1).await + fib(n-2).await
   }
}The compiler helpfully tells us that:
error[E0733]: recursion in an `async fn` requires boxing
--> src/main.rs:1:26
  |
1 | async fn fib(n : u32) -> u32 {
  |                          ^^^ recursive `async fn`
  |
  = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future`.
  = note: consider using the `async_recursion` crate: https://crates.io/crates/async_recursion
This crate provides an attribute macro to automatically convert an async function
to one returning a boxed Future.
Example
use async_recursion::async_recursion;
#[async_recursion]
async fn fib(n : u32) -> u32 {
   match n {
       0 | 1 => 1,
       _ => fib(n-1).await + fib(n-2).await
   }
}?Send Option
The returned future has a Send bound to make sure it can be sent between threads.
If this is undesirable you can mark that the bound should be left out like so:
#[async_recursion(?Send)]
async fn example() {
    // ...
}In detail:
- #[async_recursion]modifies your function to return a- BoxFuture, and
- #[async_recursion(?Send)]modifies your function to return a- LocalBoxFuture.
License
Licensed under either of
- Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (http://opensource.org/licenses/MIT)
at your option.