Skip to content

Commit

Permalink
Lazy init circe codecs to make it more SPark friendly
Browse files Browse the repository at this point in the history
  • Loading branch information
pomadchin committed Mar 31, 2022
1 parent 9cc9609 commit 8e3d65c
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 14 deletions.
16 changes: 8 additions & 8 deletions vector/src/main/scala/geotrellis/vector/io/json/CrsFormats.scala
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ import geotrellis.proj4.CRS

/** A trait specifying CRS/JSON conversion */
trait CrsFormats {
implicit val crsEncoder: Encoder[CRS] =
implicit lazy val crsEncoder: Encoder[CRS] =
Encoder.encodeString.contramap[CRS] { _.toProj4String }

implicit val crsDecoder: Decoder[CRS] =
implicit lazy val crsDecoder: Decoder[CRS] =
Decoder.decodeString.emap { str =>
Either.catchNonFatal(CRS.fromString(str)).leftMap(_ => "CRS must be a proj4 string.")
}

implicit val linkedCRSEncoder: Encoder[LinkedCRS] =
implicit lazy val linkedCRSEncoder: Encoder[LinkedCRS] =
Encoder.encodeJson.contramap[LinkedCRS] { obj =>
Json.obj(
"type" -> "link".asJson,
Expand All @@ -44,7 +44,7 @@ trait CrsFormats {
)
}

implicit val linkedCRSDecoder: Decoder[LinkedCRS] =
implicit lazy val linkedCRSDecoder: Decoder[LinkedCRS] =
Decoder.decodeHCursor.emap { c: HCursor =>
c.downField("type").as[String].flatMap {
case "link" =>
Expand All @@ -59,15 +59,15 @@ trait CrsFormats {
}.leftMap(_ => "Unable to parse LinkedCRS")
}

implicit val namedCRSEncoder: Encoder[NamedCRS] =
implicit lazy val namedCRSEncoder: Encoder[NamedCRS] =
Encoder.encodeJson.contramap[NamedCRS] { obj =>
Json.obj(
"type" -> "name".asJson,
"properties" -> Json.obj("name" -> obj.name.asJson)
)
}

implicit val namedCRSDecoder: Decoder[NamedCRS] =
implicit lazy val namedCRSDecoder: Decoder[NamedCRS] =
Decoder.decodeHCursor.emap { c: HCursor =>
c.downField("type").as[String].flatMap {
case "name" =>
Expand All @@ -82,13 +82,13 @@ trait CrsFormats {
}.leftMap(_ => "Unable to parse NamedCRS")
}

implicit val jsonCrsEncoder: Encoder[JsonCRS] =
implicit lazy val jsonCrsEncoder: Encoder[JsonCRS] =
Encoder.encodeJson.contramap[JsonCRS] {
case crs: NamedCRS => crs.asJson
case crs: LinkedCRS => crs.asJson
}

implicit val jsonCrsDecoder: Decoder[JsonCRS] = {
implicit lazy val jsonCrsDecoder: Decoder[JsonCRS] = {
Decoder.decodeHCursor.emap { c: HCursor =>
c.downField("type").as[String].flatMap {
case "name" => c.as[NamedCRS]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,21 +87,21 @@ trait FeatureFormats {
implicit def featureEncoder[G <: Geometry: Encoder, D: Encoder]: Encoder[Feature[G, D]] =
Encoder.encodeJson.contramap[Feature[G, D]] { writeFeatureJson }

implicit val featureCollectionEncoder: Encoder[JsonFeatureCollection] =
implicit lazy val featureCollectionEncoder: Encoder[JsonFeatureCollection] =
Encoder.encodeJson.contramap[JsonFeatureCollection] { _.asJson }

implicit val featureCollectionDecoder: Decoder[JsonFeatureCollection] =
implicit lazy val featureCollectionDecoder: Decoder[JsonFeatureCollection] =
Decoder.decodeHCursor.emap { c: HCursor =>
(c.downField("type").as[String], c.downField("features").focus) match {
case (Right("FeatureCollection"), Some(features)) => Right(JsonFeatureCollection(features.asArray.toVector.flatten))
case _ => Left("FeatureCollection expected")
}
}

implicit val featureCollectionMapEncoder: Encoder[JsonFeatureCollectionMap] =
implicit lazy val featureCollectionMapEncoder: Encoder[JsonFeatureCollectionMap] =
Encoder.encodeJson.contramap[JsonFeatureCollectionMap] { _.asJson }

implicit val featureCollectionMapDecoder: Decoder[JsonFeatureCollectionMap] =
implicit lazy val featureCollectionMapDecoder: Decoder[JsonFeatureCollectionMap] =
Decoder.decodeHCursor.emap { c: HCursor =>
(c.downField("type").as[String], c.downField("features").focus) match {
case (Right("FeatureCollection"), Some(features)) => Right(JsonFeatureCollectionMap(features.asArray.toVector.flatten))
Expand Down
4 changes: 2 additions & 2 deletions vector/src/main/scala/geotrellis/vector/io/json/Style.scala
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ object Style {
if (!java.lang.Double.isNaN(fillOpacity)) Some(fillOpacity) else None
)

implicit val styleDecoder: Decoder[Style] =
implicit lazy val styleDecoder: Decoder[Style] =
Decoder.decodeHCursor.emap { c: HCursor =>
val strokeColor =
c.downField("stroke").as[String] match {
Expand Down Expand Up @@ -80,7 +80,7 @@ object Style {
Right(Style(strokeColor, strokeWidth, strokeOpacity, fillColor, fillOpacity))
}

implicit val styleEncoder: Encoder[Style] =
implicit lazy val styleEncoder: Encoder[Style] =
Encoder.encodeJson.contramap[Style] { style =>
val l = mutable.ListBuffer[(String, Json)]()
if (style.strokeColor.isDefined) l += (("stroke", style.strokeColor.get.asJson))
Expand Down

0 comments on commit 8e3d65c

Please sign in to comment.