This is partly true. Unlike JS (where the colouring argument came from) you can always just block, so while you mean be "stealing" an event dispatcher thread nothing bad will happen, you just have to deal with the fact that the functions you are calling may task some time to return (as the article argues). There is no true function colouring in Rust. (Much like you can unwrap an Option or Result to handle that type of colouring.) In Rust an `async` function is just a fancy way to write a function that returns a `std::future::Future. You can certainly write a trait with functions that return a `std::future::Future<Output=T>`. Although you will probably have to box them at the moment.
https://play.rust-lang.org/?version=stable&mode=debug&editio...
I think this restriction is because they are trying to figure out how to handle dynamic vs static generics. Presumably they will add support for this in the future.
The compiler also recommends https://docs.rs/async-trait which has a pretty clean solution.