-
-
Save TomLous/299125b10fb730b22a4e106e89fba48c to your computer and use it in GitHub Desktop.
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) |
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":[]}
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":[]}