hq/app/aws/AwsAsyncHandler.scala (34 lines of code) (raw):
package aws
import utils.attempt.{Attempt, Failure}
import java.util.concurrent.CompletableFuture
import scala.concurrent.{ExecutionContext, Future, Promise}
object AwsAsyncHandler {
private val ServiceName = ".*Service: ([^;]+);.*".r
def asScala[T](cf: CompletableFuture[T]): Future[T] = {
val p = Promise[T]()
cf.whenCompleteAsync{ (result, ex) =>
if (result == null) p failure ex
else p success result
}
p.future
}
def handleAWSErrs[T, Client](awsClient: AwsClient[Client])(f: => Future[T])(implicit ec: ExecutionContext): Attempt[T] = {
Attempt.fromFuture(f) { case e =>
val serviceNameOpt = e.getMessage match {
case ServiceName(serviceName) => Some(serviceName)
case _ => None
}
if (e.getMessage.contains("The security token included in the request is expired")) {
Failure.expiredCredentials(serviceNameOpt, awsClient).attempt
} else if (e.getMessage.contains("Unable to load AWS credentials from any provider in the chain")) {
Failure.noCredentials(serviceNameOpt, awsClient).attempt
} else if (e.getMessage.contains("not authorized to perform")) {
Failure.insufficientPermissions(serviceNameOpt, awsClient).attempt
} else if (e.getMessage.contains("Rate exceeded")) {
Failure.rateLimitExceeded(serviceNameOpt, awsClient).attempt
} else {
Failure.awsError(serviceNameOpt, awsClient, e).attempt
}
}
}
}