Skip to content

Instantly share code, notes, and snippets.

@TomLous
Last active April 10, 2018 11:55
Show Gist options
  • Save TomLous/299125b10fb730b22a4e106e89fba48c to your computer and use it in GitHub Desktop.
Save TomLous/299125b10fb730b22a4e106e89fba48c to your computer and use it in GitHub Desktop.
Scala cats map EitherT Futures with key->value pairs
import scala.util._
import scala.concurrent._
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global
import com.datlinq.datafiniti.response.DatafinitiError
import com.datlinq.datafiniti.config.DatafinitiAPITypes.Businesses
import cats.implicits._
import org.json4s._
// Two ok ids's two not ok
val ids:List[String] = List("AWEF3R5B3-Khe5l_drZz","AWHMSleZIxWefVJwzAKh","ccc", "ddd")
/**
* Why cats traverse?
* Converting a List[Strings] to a List[Futures] is possible, but rather unwieldy in handling
* Given a list of ids (List[String]) and a fuction String => Future[_] traverse gives you a Future[List[_]]
*
* caveat: Will compile, but unfortunately you have to define the type if you do't want Intellij to freak out (https://youtrack.jetbrains.com/issue/SCL-10259)
*/
val action:Future[List[(String, Either[DatafinitiError, JValue])]] = ids.traverse(
id => apiv4.recordById(id, Businesses).value.map(id -> _)
)
// side effect on complete
action.onComplete{
// if the master future succeeds
case Success(list) => list.foreach{
// the id, jvalue tupple for successful call
case (id, Right(jvalue)) => println(s"$id: " + (jvalue \ "name").extract[String])
// the datafiniti error when call fails
case (id, Left(e)) => println(s"$id: ${e.message}")
}
// if the future fails (network issue, api down, timouts etc)
case Failure(f) => println(f.getMessage)
}
// The result if you don't want to use side effects from onComplete (use recover, transform etc)
val res:List[(String,Either[DatafinitiError,JValue])] = Await.result(action, Duration.Inf)
println(res)
@TomLous
Copy link
Author

TomLous commented Apr 10, 2018

Output (printlns):

AWEF3R5B3-Khe5l_drZz: Bon Chef
AWHMSleZIxWefVJwzAKh: De Admiraal
ccc: HTTP error 404 from https://api.datafiniti.co/v4/businesses/ccc => {"errors":[]}
ddd: HTTP error 404 from https://api.datafiniti.co/v4/businesses/ddd => {"errors":[]}

@TomLous
Copy link
Author

TomLous commented Apr 10, 2018

12:09:02.836 [scala-execution-context-global-11] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - response from https://api.datafiniti.co/v4/auth => Connection: keep-alive | Content-Encoding: gzip | Content-Type: application/json | Date: Tue, 10 Apr 2018 10:09:02 GMT | Server: Jetty(9.4.6.v20170531) | Status: HTTP/1.1 200 OK | Transfer-Encoding: chunked
12:09:02.860 [scala-execution-context-global-13] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - get: https://api.datafiniti.co/v4/businesses/AWEF3R5B3-Khe5l_drZz, followRedirect: true
12:09:02.860 [scala-execution-context-global-14] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - get: https://api.datafiniti.co/v4/businesses/AWHMSleZIxWefVJwzAKh, followRedirect: true
12:09:02.861 [scala-execution-context-global-15] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - get: https://api.datafiniti.co/v4/businesses/ccc, followRedirect: true
12:09:02.861 [scala-execution-context-global-16] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - get: https://api.datafiniti.co/v4/businesses/ddd, followRedirect: true
12:09:03.132 [scala-execution-context-global-16] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - response from https://api.datafiniti.co/v4/businesses/ddd => Connection: keep-alive | Content-Type: text/html;charset=utf-8 | Date: Tue, 10 Apr 2018 10:09:03 GMT | Server: Jetty(9.4.6.v20170531) | Status: HTTP/1.1 404 Not Found | Transfer-Encoding: chunked
12:09:03.132 [scala-execution-context-global-14] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - response from https://api.datafiniti.co/v4/businesses/AWHMSleZIxWefVJwzAKh => Connection: keep-alive | Content-Encoding: gzip | Content-Type: application/json | Date: Tue, 10 Apr 2018 10:09:03 GMT | Server: Jetty(9.4.6.v20170531) | Status: HTTP/1.1 200 OK | Transfer-Encoding: chunked
12:09:03.133 [scala-execution-context-global-13] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - response from https://api.datafiniti.co/v4/businesses/AWEF3R5B3-Khe5l_drZz => Connection: keep-alive | Content-Encoding: gzip | Content-Type: application/json | Date: Tue, 10 Apr 2018 10:09:03 GMT | Server: Jetty(9.4.6.v20170531) | Status: HTTP/1.1 200 OK | Transfer-Encoding: chunked
12:09:03.134 [scala-execution-context-global-16] ERROR c.datlinq.datafiniti.DatafinitiAPIv4 - HTTP error 404 from https://api.datafiniti.co/v4/businesses/ddd => {"errors":[]}
12:09:03.139 [scala-execution-context-global-15] DEBUG c.datlinq.datafiniti.DatafinitiAPIv4 - response from https://api.datafiniti.co/v4/businesses/ccc => Connection: keep-alive | Content-Type: text/html;charset=utf-8 | Date: Tue, 10 Apr 2018 10:09:03 GMT | Server: Jetty(9.4.6.v20170531) | Status: HTTP/1.1 404 Not Found | Transfer-Encoding: chunked
12:09:03.139 [scala-execution-context-global-15] ERROR c.datlinq.datafiniti.DatafinitiAPIv4 - HTTP error 404 from https://api.datafiniti.co/v4/businesses/ccc => {"errors":[]}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment