Skip to content

Commit

Permalink
Make SttpClient simple, remove the type member field, update SearchFi…
Browse files Browse the repository at this point in the history
…lters circe codecs
  • Loading branch information
pomadchin committed May 6, 2021
1 parent 798519a commit f27296f
Show file tree
Hide file tree
Showing 11 changed files with 63 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import com.azavea.stac4s.jsTypes.TemporalExtent

import eu.timepit.refined.types.numeric.NonNegInt
import io.circe._
import io.circe.generic.semiauto._
import io.circe.refined._

case class SearchFilters(
Expand All @@ -23,13 +22,13 @@ case class SearchFilters(

object SearchFilters extends ClientCodecs {

implicit val searchFilterDecoder: Decoder[SearchFilters] = { c =>
implicit val searchFiltersDecoder: Decoder[SearchFilters] = { c =>
for {
bbox <- c.downField("bbox").as[Option[Bbox]]
datetime <- c.downField("datetime").as[Option[TemporalExtent]]
intersects <- c.downField("intersects").as[Option[Geometry]]
collectionsOption <- c.downField("collections").as[Option[List[String]]]
itemsOption <- c.downField("items").as[Option[List[String]]]
itemsOption <- c.downField("ids").as[Option[List[String]]]
limit <- c.downField("limit").as[Option[NonNegInt]]
query <- c.get[Option[Map[String, List[Query]]]]("query")
paginationToken <- c.get[Option[PaginationToken]]("next")
Expand All @@ -47,5 +46,25 @@ object SearchFilters extends ClientCodecs {
}
}

implicit val searchFilterEncoder: Encoder[SearchFilters] = deriveEncoder
implicit val searchFiltersEncoder: Encoder[SearchFilters] = Encoder.forProduct8(
"bbox",
"datetime",
"intersects",
"collections",
"ids",
"limit",
"query",
"next"
)(filters =>
(
filters.bbox,
filters.datetime,
filters.intersects,
filters.collections,
filters.items,
filters.limit,
filters.query,
filters.next
)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ import sttp.model.Uri

object SttpStacClient {

def apply[F[_]: MonadError[*[_], Throwable]](
client: SttpBackend[F, Any],
baseUri: Uri
): SttpStacClient[F] =
SttpStacClientF.instance[F, SearchFilters](client, baseUri)
def apply[F[_]: MonadError[*[_], Throwable]](client: SttpBackend[F, Any], baseUri: Uri): SttpStacClient[F] =
SttpStacClientF[F, SearchFilters](client, baseUri)
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.azavea.stac4s.api

package object client {
type SttpStacClient[F[_]] = SttpStacClientF.Aux[F, SearchFilters]
type StacClient[F[_]] = StacClientF[F, SearchFilters]
type SttpStacClient[F[_]] = SttpStacClientF[F, SearchFilters]
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import com.azavea.stac4s.testing.JsInstances

import sttp.client3.UriContext

class SttpStacClientSpec extends SttpStacClientFSpec with JsInstances {
class SttpStacClientSpec extends SttpStacClientFSpec[SearchFilters] with JsInstances {
lazy val client = SttpStacClient(backend, uri"http://localhost:9090")
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import com.azavea.stac4s.jvmTypes.TemporalExtent
import eu.timepit.refined.types.numeric.NonNegInt
import geotrellis.vector.{io => _, _}
import io.circe._
import io.circe.generic.semiauto._
import io.circe.refined._

case class SearchFilters(
Expand All @@ -23,13 +22,13 @@ case class SearchFilters(

object SearchFilters extends ClientCodecs {

implicit val searchFilterDecoder: Decoder[SearchFilters] = { c =>
implicit val searchFiltersDecoder: Decoder[SearchFilters] = { c =>
for {
bbox <- c.downField("bbox").as[Option[Bbox]]
datetime <- c.downField("datetime").as[Option[TemporalExtent]]
intersects <- c.downField("intersects").as[Option[Geometry]]
collectionsOption <- c.downField("collections").as[Option[List[String]]]
itemsOption <- c.downField("items").as[Option[List[String]]]
itemsOption <- c.downField("ids").as[Option[List[String]]]
limit <- c.downField("limit").as[Option[NonNegInt]]
query <- c.get[Option[Map[String, List[Query]]]]("query")
paginationToken <- c.get[Option[PaginationToken]]("next")
Expand All @@ -47,5 +46,25 @@ object SearchFilters extends ClientCodecs {
}
}

implicit val searchFilterEncoder: Encoder[SearchFilters] = deriveEncoder
implicit val searchFiltersEncoder: Encoder[SearchFilters] = Encoder.forProduct8(
"bbox",
"datetime",
"intersects",
"collections",
"ids",
"limit",
"query",
"next"
)(filters =>
(
filters.bbox,
filters.datetime,
filters.intersects,
filters.collections,
filters.items,
filters.limit,
filters.query,
filters.next
)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ import sttp.model.Uri

object SttpStacClient {

def apply[F[_]: MonadError[*[_], Throwable]](
client: SttpBackend[F, Any],
baseUri: Uri
): SttpStacClient[F] =
SttpStacClientF.instance[F, SearchFilters](client, baseUri)
def apply[F[_]: MonadError[*[_], Throwable]](client: SttpBackend[F, Any], baseUri: Uri): SttpStacClient[F] =
SttpStacClientF[F, SearchFilters](client, baseUri)
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.azavea.stac4s.api

package object client {
type SttpStacClient[F[_]] = SttpStacClientF.Aux[F, SearchFilters]
type StacClient[F[_]] = StacClientF[F, SearchFilters]
type SttpStacClient[F[_]] = SttpStacClientF[F, SearchFilters]
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import com.azavea.stac4s.testing.JvmInstances

import sttp.client3.UriContext

class SttpStacClientSpec extends SttpStacClientFSpec with JvmInstances {
class SttpStacClientSpec extends SttpStacClientFSpec[SearchFilters] with JvmInstances {
lazy val client = SttpStacClient(backend, uri"http://localhost:9090")
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@ import com.azavea.stac4s._

import eu.timepit.refined.types.string.NonEmptyString

trait StacClient[F[_]] {
type Filter
trait StacClientF[F[_], S] {
def search: F[List[StacItem]]
def search(filter: Filter): F[List[StacItem]]
def search(filter: S): F[List[StacItem]]
def collections: F[List[StacCollection]]
def collection(collectionId: NonEmptyString): F[StacCollection]
def items(collectionId: NonEmptyString): F[List[StacItem]]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,13 @@ import sttp.client3.circe.asJson
import sttp.client3.{SttpBackend, basicRequest}
import sttp.model.Uri

abstract class SttpStacClientF[F[_]: MonadError[*[_], Throwable]](
case class SttpStacClientF[F[_]: MonadError[*[_], Throwable], S: Encoder](
client: SttpBackend[F, Any],
baseUri: Uri
) extends StacClient[F] {

type Filter

protected implicit def filterEncoder: Encoder[Filter]

) extends StacClientF[F, S] {
def search: F[List[StacItem]] = search(None)

def search(filter: Filter): F[List[StacItem]] = search(filter.asJson.some)
def search(filter: S): F[List[StacItem]] = search(filter.asJson.some)

private def search(filter: Option[Json]): F[List[StacItem]] =
client
Expand Down Expand Up @@ -91,15 +86,3 @@ abstract class SttpStacClientF[F[_]: MonadError[*[_], Throwable]](
.map(_.body)
.flatMap(MonadError[F, Throwable].fromEither)
}

object SttpStacClientF {
type Aux[F[_], S] = SttpStacClientF[F] { type Filter = S }

def instance[F[_]: MonadError[*[_], Throwable], S](
client: SttpBackend[F, Any],
baseUri: Uri
)(implicit sencoder: Encoder[S]): Aux[F, S] = new SttpStacClientF[F](client, baseUri) {
type Filter = S
protected val filterEncoder: Encoder[Filter] = sencoder
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ import sttp.client3.testing.SttpBackendStub
import sttp.model.Method
import sttp.monad.EitherMonad

trait SttpStacClientFSpec extends AnyFunSpec with Matchers with BeforeAndAfterAll {
trait SttpStacClientFSpec[S] extends AnyFunSpec with Matchers with BeforeAndAfterAll {

def arbCollectionShort: Arbitrary[StacCollection]
def arbItemCollectionShort: Arbitrary[ItemCollection]
def arbItemShort: Arbitrary[StacItem]

def client: SttpStacClientF[Either[Throwable, *]]
def client: SttpStacClientF[Either[Throwable, *], S]

lazy val backend =
SttpBackendStub(EitherMonad)
Expand Down

0 comments on commit f27296f

Please sign in to comment.