backend/app/utils/aws/AwsAsyncHandler.scala (33 lines of code) (raw):

package utils.aws import com.amazonaws.AmazonWebServiceRequest import com.amazonaws.handlers.AsyncHandler import utils.Logging import utils.attempt.{Attempt, Failure, UnknownFailure} import scala.concurrent.{ExecutionContext, Promise} import scala.util.control.NonFatal class AwsAsyncPromiseHandler[R <: AmazonWebServiceRequest, T](promise: Promise[Either[Failure, T]]) extends AsyncHandler[R, T] with Logging { def onError(e: Exception) = { e match { case NonFatal(t) => logger.warn("Failed to execute AWS SDK operation", t) val failure = AwsErrors.exceptionToFailure.applyOrElse(t, UnknownFailure(_)) promise success Left(failure) case fatal => logger.error("Failed to execute AWS SDK operation", fatal) promise failure fatal } } def onSuccess(r: R, t: T) = { promise success Right(t) } } object AwsAsyncHandler { def awsToScala[R <: AmazonWebServiceRequest, T](sdkMethod: (R, AsyncHandler[R, T]) => java.util.concurrent.Future[T]) (req: R) (implicit ec: ExecutionContext): Attempt[T] = { val p = Promise[Either[Failure, T]]() sdkMethod(req, new AwsAsyncPromiseHandler(p)) Attempt(p.future) } }