@jbz as a Rust enthusiast I mostly agree with this post.
I'll add another downside: due to the friggin' orphan rule it's impossible to extend a dependency's functionality without forking it (e.g.: you can't add additional derives to a foreign crate's types).
Re async, it's often made extra hard because the default (language!) assumption is multithreading. Thread-local async can make it much more pleasant, as outlined here: https://maciej.codes/2022-06-09-local-async.html
