sqlx icon indicating copy to clipboard operation
sqlx copied to clipboard

Moving away from `async_trait` and into Rust's own async traits

Open Aandreba opened this issue 6 months ago • 3 comments

Given the recent stabilization of async fn and return impl Trait in traits on Rust 1.75.0, perhaps it should be time to consider moving away from the async_trait crate.

This would probably allow the compiler to optimize async blocks more easily, and would most likely result in a decrease in memory usage (given that async_trait boxes the futures returned by the trait functions). It would also mean one dependency less to maintain, which is always nice.

Things to consider

  • [ ] The effect this migration on the MSRV
  • [ ] This would definitively be a breaking change (though I suspect not a lot of applications would actually be affected that much)

If you see any other downsides (or benefits) to this change, please feel free to comment them.

Aandreba avatar Feb 13 '24 17:02 Aandreba

Though removing unnecessary boxing is always nice, I don't feel bumping the MSRV to 1.75 is worth the change. We would also really just swap async_trait for trait_variant (or do it by hand anyway). I say we wait until RPITIT is more mature and not discouraged by the async team.

saiintbrisson avatar Feb 16 '24 15:02 saiintbrisson

We would also really just swap async_trait for trait_variant (or do it by hand anyway).

I don't think trait_variant is required, because sqlx requires the futures to be Send anyways, so no need (and no possiblity either) to support both Send and !Send. This also means that the current limitation doesn't apply from what I understand.

See also the discussion in #3016

FSMaxB avatar Feb 16 '24 16:02 FSMaxB

Re. MSRV, I'll remind readers of our official policy: https://github.com/launchbadge/sqlx/blob/main/FAQ.md#what-versions-of-rust-does-sqlx-support-what-is-sqlxs-msrv

If we do this refactor alongside #3016 it would have to be a major release anyway as that's a breaking change.

abonander avatar Feb 17 '24 02:02 abonander