79595748

Date: 2025-04-28 03:25:37
Score: 1
Natty:
Report link

Here is a utility code for those having the same issue in

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(...))

Reasons:
  • Long answer (-1):
  • Has code block (-0.5):
  • Me too answer (2.5): having the same issue
Posted by: Iraj Hedayati