Skip to content

Commit

Permalink
Fix LocationInfo Play Json serializer (#1096)
Browse files Browse the repository at this point in the history
  • Loading branch information
ghostdogpr authored Oct 16, 2021
1 parent ce6f97d commit 27ac36f
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 34 deletions.
22 changes: 9 additions & 13 deletions core/src/main/scala-2/caliban/interop/play/play.scala
Original file line number Diff line number Diff line change
Expand Up @@ -111,18 +111,16 @@ object json {
case JsNull => NullValue
}

def responseObjectValueFromFields(fields: scala.collection.Map[String, JsValue]) =
def responseObjectValueFromFields(fields: scala.collection.Map[String, JsValue]): ResponseValue.ObjectValue =
ResponseValue.ObjectValue(fields.map { case (k, v) =>
k -> jsonToResponseValue(v)
}.toList)

val responseObjectValueReads: Reads[ResponseValue.ObjectValue] =
Reads(json =>
json match {
case JsObject(fields) => JsSuccess(responseObjectValueFromFields(fields))
case _ => JsError("not a json object")
}
)
Reads {
case JsObject(fields) => JsSuccess(responseObjectValueFromFields(fields))
case _ => JsError("not a json object")
}

val responseValueReads: Reads[ResponseValue] =
Reads(json => JsSuccess(jsonToResponseValue(json)))
Expand Down Expand Up @@ -150,11 +148,9 @@ object json {
path: Option[JsArray]
)

implicit val locationInfoWrites: Writes[LocationInfo] =
Json.writes[LocationInfo].transform((v: JsValue) => Json.arr(v))

implicit val locationInfoWrites: Writes[LocationInfo] = Json.writes[LocationInfo]
implicit val responseObjectValueWrites: Writes[ResponseValue.ObjectValue] = ValuePlayJson.responseObjectValueWrites
private implicit val errorDTOWrites = Json.writes[ErrorDTO]
private implicit val errorDTOWrites: Writes[ErrorDTO] = Json.writes[ErrorDTO]

val errorValueWrites: Writes[CalibanError] = errorDTOWrites.contramap[CalibanError] {
case CalibanError.ParsingError(msg, locationInfo, _, extensions) =>
Expand Down Expand Up @@ -196,7 +192,7 @@ object json {
case JsNumber(bd) => Right(bd.toInt)
case _ => throw new Exception("invalid json")
},
locationInfo = e.locations.flatMap(_.lift(0)),
locationInfo = e.locations.flatMap(_.headOption),
None,
e.extensions
)
Expand Down Expand Up @@ -227,7 +223,7 @@ object json {
case _ => Json.obj("message" -> err.toString)
}

implicit val errorReads = ErrorPlayJson.errorValueReads
implicit val errorReads: Reads[CalibanError] = ErrorPlayJson.errorValueReads
val graphQLResponseReads: Reads[GraphQLResponse[CalibanError]] =
(JsPath \ "data")
.read[ResponseValue]
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/scala/caliban/GraphQLResponse.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ object GraphQLResponse extends GraphQLResponseJsonCompat {
implicit def circeEncoder[F[_]: IsCirceEncoder, E]: F[GraphQLResponse[E]] =
caliban.interop.circe.json.GraphQLResponseCirce.graphQLResponseEncoder.asInstanceOf[F[GraphQLResponse[E]]]
implicit def circeDecoder[F[_]: IsCirceDecoder, E]: F[GraphQLResponse[E]] =
caliban.interop.circe.json.GraphQLResponseCirce.graphQLRespondDecoder.asInstanceOf[F[GraphQLResponse[E]]]
caliban.interop.circe.json.GraphQLResponseCirce.graphQLResponseDecoder.asInstanceOf[F[GraphQLResponse[E]]]
}
2 changes: 1 addition & 1 deletion core/src/main/scala/caliban/interop/circe/circe.scala
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ object json {
)
}

implicit val graphQLRespondDecoder: Decoder[GraphQLResponse[CalibanError]] =
implicit val graphQLResponseDecoder: Decoder[GraphQLResponse[CalibanError]] =
Decoder.instance(cursor =>
for {
data <- cursor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
package caliban.interop.play

import caliban.CalibanError
import caliban.CalibanError.ExecutionError
import caliban.GraphQLResponse
import caliban.ResponseValue
import caliban.ResponseValue.ListValue
import caliban.ResponseValue.ObjectValue
import caliban.Value
import caliban.Value.FloatValue
import caliban.Value.IntValue
import caliban.ResponseValue.{ ListValue, ObjectValue }
import caliban.{ CalibanError, GraphQLResponse, Value }
import caliban.Value.StringValue
import caliban.parsing.adt.LocationInfo
import play.api.libs.json._
Expand Down Expand Up @@ -39,6 +33,7 @@ object GraphQLResponsePlaySpec extends DefaultRunnableSpec {
List(
ExecutionError(
"Resolution failed",
locationInfo = Some(LocationInfo(1, 2)),
extensions = Some(ObjectValue(errorExtensions))
)
)
Expand All @@ -51,6 +46,7 @@ object GraphQLResponsePlaySpec extends DefaultRunnableSpec {
"errors" -> Json.arr(
Json.obj(
"message" -> JsString("Resolution failed"),
"locations" -> Json.arr(Json.obj("column" -> JsNumber(1), "line" -> JsNumber(2))),
"extensions" -> Json.obj("errorCode" -> JsString("TEST_ERROR"), "myCustomKey" -> JsString("my-value"))
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
package caliban.interop.zio

import caliban.CalibanError
import caliban.CalibanError.ExecutionError
import caliban.GraphQLResponse
import caliban.ResponseValue
import caliban.ResponseValue.ListValue
import caliban.ResponseValue.ObjectValue
import caliban.Value.FloatValue
import caliban.Value.IntValue
import caliban.Value.StringValue
import caliban.{ CalibanError, GraphQLResponse }
import caliban.ResponseValue.{ ListValue, ObjectValue }
import caliban.Value.{ IntValue, StringValue }
import caliban.parsing.adt.LocationInfo
import zio.json._
import zio.test.Assertion._
import zio.test._

import Assertion._

object GraphQLResponseZIOSpec extends DefaultRunnableSpec {
implicit val encoder: JsonEncoder[GraphQLResponse[Any]] = GraphQLResponse.zioJsonEncoder

Expand All @@ -35,14 +29,15 @@ object GraphQLResponseZIOSpec extends DefaultRunnableSpec {
List(
ExecutionError(
"Resolution failed",
locationInfo = Some(LocationInfo(1, 2)),
extensions = Some(ObjectValue(errorExtensions))
)
)
)

assert(response.toJson)(
equalTo(
"""{"data":"data","errors":[{"message":"Resolution failed","extensions":{"errorCode":"TEST_ERROR","myCustomKey":"my-value"}}]}"""
"""{"data":"data","errors":[{"message":"Resolution failed","extensions":{"errorCode":"TEST_ERROR","myCustomKey":"my-value"},"locations":[{"line":2,"column":1}]}]}"""
)
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ object GraphQLResponseCirceSpec extends DefaultRunnableSpec {
List(
ExecutionError(
"Resolution failed",
locationInfo = Some(LocationInfo(1, 2)),
extensions = Some(ObjectValue(errorExtensions))
)
)
Expand All @@ -51,6 +52,7 @@ object GraphQLResponseCirceSpec extends DefaultRunnableSpec {
"errors" -> Json.arr(
Json.obj(
"message" -> Json.fromString("Resolution failed"),
"locations" -> Json.arr(Json.obj("column" -> Json.fromInt(1), "line" -> Json.fromInt(2))),
"extensions" -> Json.obj("errorCode" -> "TEST_ERROR".asJson, "myCustomKey" -> "my-value".asJson)
)
)
Expand Down

0 comments on commit 27ac36f

Please sign in to comment.