Async has always been one of the hottest topics within Rust, and the most controversial. Perhaps this will be one of the topics that eventually, a decade or two down the line, will mandate replacing Rust with yet another programming language, just as Rust is currently replacing C++ (at least, as the new favorite in the high-abstraction-yet-low-level bracket of the programming language wars that C++ used to occupy all by itself).
I wrote In Defense of Async: Function Colors Are Rusty, but honestly I’m not sure how much I stand by it.
To the extent that Rust prevents mistakes in function colors, I think function colors are Rusty. Different types of functions have different execution models, and Rust helps you keep track of which is which, and forbids you from mixing it up. To the extent, however, that Rust fails at this goal, and makes users manually track function colors in their head, well, that’s not very Rusty.
Blocking Sockets and Async documents one such situation I ran into. Boy, what a mess!
One thing I haven’t (yet) attempted is an explanation of what async is and what async is for.