As a Rust user, I have to say that it was an incredibly confusing feature.

Not because of the technical decisions behind async/await, but because of the async ecosystem, especially the runtimes.

Picture a Rust user when the feature came:

- You can use it with future combinators!

- No, actually, use it with a macro library that almost works but not really.

- Here is Tokio (with a lot of moving parts).

- Wait, async std is much simpler (again, almost seems to work but not really).

- Wait, here is Smol, which is truly simpler (or at least smaller but not used).

=> You get "async fatigue."

I can understand the position: let's not commit to anything before seeing what sticks on the wall.

It might have worked for Serde (even that is debatable by some).

But as a user, it's hard to follow, and you get the impression that this feature is not the stable foundation you can build on.

Honestly, it gets better once you learn to stop worrying and love tokio.

I don't like the idea of having a single framework shaping up the entire Rust ecosystem, but at the same time once you just jump the tokio ship, everything just works out of the box and you don't have to worry. lots I wonder what are you referring to when talking about “lots of moving parts” when tokio has reached 1.0 three years ago and been pretty much stable since then.