Here is a utility code for those having the same issue in scala
package com.example
import com.google.api.core.{ApiFuture, ApiFutureCallback, ApiFutures}
import com.google.common.util.concurrent.MoreExecutors
import java.util.concurrent.CompletableFuture
import scala.language.implicitConversions
object ApiCompletableFuture {
implicit def toCompletableFuture[T](future: ApiFuture[T]): CompletableFuture[T] =
new ApiCompletableFuture(future)
}
class ApiCompletableFuture[T](future: ApiFuture[T])
extends CompletableFuture[T] with ApiFutureCallback[T] {
ApiFutures.addCallback(future, this, MoreExecutors.directExecutor())
override def cancel(mayInterruptIfRunning: Boolean): Boolean = {
future.cancel(mayInterruptIfRunning)
super.cancel(mayInterruptIfRunning)
}
def onFailure(t: Throwable): Unit = completeExceptionally(t)
def onSuccess(result: Nothing): Unit = complete(result)
}
Then, in your code:
import com.example.ApiCompletableFuture.*
IO.fromCompletableFuture(IO(docRef.set(...))