15 releases (8 stable)
1.1.1 | Apr 25, 2024 |
---|---|
1.1.0 | Mar 17, 2024 |
1.0.5 | Sep 2, 2023 |
1.0.4 | Mar 18, 2023 |
0.1.2 | Oct 4, 2019 |
#62 in Asynchronous
1,905,376 downloads per month
Used in 1,700 crates
(502 directly)
18KB
243 lines
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 returned_future_is_not_send() {
// ...
}
Sync option
The returned Future
doesn't have a Sync
bound as it is usually not required.
You can include a Sync
bound as follows:
#[async_recursion(Sync)]
async fn returned_future_is_sync() {
// ...
}
In detail:
#[async_recursion]
modifies your function to return a boxedFuture
with aSend
bound.#[async_recursion(?Send)]
modifies your function to return a boxedFuture
without aSend
bound.#[async_recursion(Sync)]
modifies your function to return a boxedFuture
with aSend
andSync
bound.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Dependencies
~225–670KB
~16K SLoC