I just ran into the wonderful error message
the trait is not dyn compatible because method
publish_videoisasync
and boy, what a rabbit hole. I found out about async_trait which resolves this by turning async methods into fn method() -> Pin<Box<dyn Future + Send + 'async_trait>>, but I thought that’s what the async fn was syntax sugar for??? Then I ran into this member-only medium post claiming
Rust Async Traits: What Finally Works Now
Async functions in traits shipped. Here’s what that means for your service interfaces.
But I clicked through every rust release since 1.75.0 where impl AsyncTrait was shipped and couldn’t find a mention of async. Now I’m just confused (and still using async_trait). Hence the question above…


Breaking down what
async fnin trait does, it converts it to afn method() -> impl Future<Output=T>, which breaks further down intofn method() -> Self::__MethodRetwhere the generated associated type implementsFuture.This doesn’t work for
dyn Traitbecause of the associated type (and the factmethod()needs a dyn-safeselfparameter).Instead, your methods need to return
dyn Futurein some capacity since that return type doesn’t rely on associated types. That’s whereasync_traitcomes in.Box<dyn Future<...>>is a dyn-safe boxed future, then it’s pinned becauseasyncusually generates a self-referential type, and you need to pin it anyway to.poll()the resulting future.Edit: also, being pedantic, associated types are fine in dyn traits, but you need to specify the type for it (like
dyn Blah<Foo=i32>. Even if you could name the return type from anasync fn, it’d be different for everyimplblock, so that’s not realistic here.