Scala 3 client implementation for the Pokemon API
To get started check the documentation on https://pokeapi.co/docs/v2
Add the following to your build.sbt:
libraryDependencies += "io.github.juliano" % "pokeapi-scala_3" % "0.3.0"
This client is written using sttp, so all of the sttp backends published for Scala 3 are supported.
Instantiate a backend implicitly, create a PokeApiClient()
and start consuming the api, calling client.send(PokeRequest(id | name))
. Most requests accept an id: Long
or name: String
(have a look at Scala 3 Union Types).
It's possible to list / paginate resources as well, calling client.send(PokeRequest.resourceList(offset: Int, limit: Int))
Every response is automatically cached in memory, making all subsequent requests to the same resource pull cached data.
import io.github.juliano.pokeapi.requests.BerryRequest
import sttp.client3.{ HttpClientSyncBackend, Identity, SttpBackend }
given backend: SttpBackend[Identity, Any] = HttpClientSyncBackend()
val client = PokeApiClient()
val berry = client.send(BerryRequest(1))
println(berry.name)
import io.github.juliano.pokeapi.requests.MoveRequest
import sttp.client3.{ SttpBackend, TryHttpURLConnectionBackend }
import scala.util.*
given backend: SttpBackend[Try, Any] = TryHttpURLConnectionBackend()
val client = PokeApiClient()
client.send(MoveRequest("pound")) match {
case Success(move) => println(move.names)
case Failure(t) => println(s"Failed with: $t")
}
import io.github.juliano.pokeapi.requests.ContestTypeRequest
import sttp.capabilities.WebSockets
import sttp.client3.{ HttpClientFutureBackend, SttpBackend }
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.util.*
given backend: SttpBackend[Future, WebSockets] = HttpClientFutureBackend()
val client = PokeApiClient()
client.send(ContestTypeRequest(1)).onComplete {
case Success(contest) => println(contest.names)
case Failure(t) => println(s"Failed with: $t")
}
import io.github.juliano.pokeapi.requests.PokemonRequest
import sttp.client3.asynchttpclient.zio.AsyncHttpClientZioBackend
import zio.{ Runtime, Unsafe, ZIO }
val client = AsyncHttpClientZioBackend().map(implicit backend => PokeApiClient())
val zio = client.flatMap(_.send(PokemonRequest("bulbasaur")))
val pokemon = Unsafe.unsafeCompat { implicit u =>
Runtime.default.unsafe.run(zio).getOrThrowFiberFailure()
}
print(pokemon.id)
import cats.effect.IO
import cats.effect.unsafe.implicits.global
import io.github.juliano.pokeapi.requests.LocationRequest
import sttp.client3.asynchttpclient.cats.AsyncHttpClientCatsBackend
val client = AsyncHttpClientCatsBackend[IO]().map(implicit backend => PokeApiClient())
val list = client.flatMap(_.send(LocationRequest.resourceList())).unsafeRunSync()
print(list.count)
You can find more examples using Fs2, Armaria and okhttp in the tests
Feel free to open pull requests or submit issues!
pokeapi-scala is available as open source under the terms of the MIT license.