// build-pass // edition:2018 type BoxFuture = std::pin::Pin>>; fn main() { f(); } async fn f() { run("dependency").await; } struct InMemoryStorage; struct User<'dep> { dep: &'dep str, } impl<'a> StorageRequest for SaveUser<'a> { fn execute(&self) -> BoxFuture> { todo!() } } trait Storage { type Error; } impl Storage for InMemoryStorage { type Error = String; } trait StorageRequestReturnType { type Output; } trait StorageRequest: StorageRequestReturnType { fn execute( &self, ) -> BoxFuture::Output, ::Error>>; } struct SaveUser<'a> { name: &'a str, } impl<'a> StorageRequestReturnType for SaveUser<'a> { type Output = (); } impl<'dep> User<'dep> { async fn save(self) where S: Storage, for<'a> SaveUser<'a>: StorageRequest, { SaveUser { name: "Joe" } .execute() .await; } } async fn run(dep: &str) where S: Storage, for<'a> SaveUser<'a>: StorageRequest, for<'a> SaveUser<'a>: StorageRequestReturnType, { User { dep }.save().await; }