Skip to content

Commit

Permalink
Better error message for jsoniter (#3860)
Browse files Browse the repository at this point in the history
  • Loading branch information
kciesielski authored Jun 19, 2024
1 parent 93da2a6 commit 61c9450
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ package sttp.tapir.json.jsoniter

import com.github.plokhotnyuk.jsoniter_scala.core._
import sttp.tapir.Codec.JsonCodec
import sttp.tapir.DecodeResult.Error.JsonDecodeException
import sttp.tapir.DecodeResult.Error.{JsonDecodeException, JsonError}
import sttp.tapir.DecodeResult.{Error, Value}
import sttp.tapir._

import scala.util.{Failure, Success, Try}

trait TapirJsonJsoniter {
lazy val readerConfig = ReaderConfig.withAppendHexDumpToParseException(false)
def jsonBody[T: JsonValueCodec: Schema]: EndpointIO.Body[String, T] = stringBodyUtf8AnyFormat(jsoniterCodec[T])

def jsonBodyWithRaw[T: JsonValueCodec: Schema]: EndpointIO.Body[String, (String, T)] = stringBodyUtf8AnyFormat(
Expand All @@ -20,7 +21,10 @@ trait TapirJsonJsoniter {

implicit def jsoniterCodec[T: JsonValueCodec: Schema]: JsonCodec[T] =
sttp.tapir.Codec.json { s =>
Try(readFromString[T](s)) match {
Try(readFromString[T](s, readerConfig)) match {
case Failure(error: JsonReaderException) =>
val errMsg = Option(error.getMessage)
Error(s, JsonDecodeException(errors = errMsg.toList.map(e => JsonError(e, Nil)), error))
case Failure(error) => Error(s, JsonDecodeException(errors = List.empty, error))
case Success(v) => Value(v)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@ import com.github.plokhotnyuk.jsoniter_scala.macros._
import org.scalatest.flatspec.AnyFlatSpecLike
import org.scalatest.matchers.should.Matchers
import sttp.tapir.DecodeResult
import sttp.tapir.DecodeResult.Error.JsonDecodeException
import sttp.tapir.DecodeResult.Error.{JsonDecodeException, JsonError}
import sttp.tapir.generic.auto._

object TapirJsoniterCodec extends TapirJsonJsoniter
object TapirJsoniterCustomCodec extends TapirJsonJsoniter {
override lazy val readerConfig: ReaderConfig = ReaderConfig.withAppendHexDumpToParseException(true)
}

class TapirJsonJsoniterTests extends AnyFlatSpecLike with Matchers {

Expand All @@ -17,6 +20,7 @@ class TapirJsonJsoniterTests extends AnyFlatSpecLike with Matchers {
it should "return a JSON specific decode error on failure" in {
implicit val codec: JsonValueCodec[Customer] = JsonCodecMaker.make
val tapirCodec = TapirJsoniterCodec.jsoniterCodec[Customer]
val tapirCodecWithHexDump = TapirJsoniterCustomCodec.jsoniterCodec[Customer]

val actual = tapirCodec.decode("{}")
actual shouldBe a[DecodeResult.Error]
Expand All @@ -26,7 +30,10 @@ class TapirJsonJsoniterTests extends AnyFlatSpecLike with Matchers {
failure.error shouldBe a[JsonDecodeException]

val error = failure.error.asInstanceOf[JsonDecodeException]
error.errors shouldEqual List.empty
error.errors shouldEqual List(JsonError("missing required field \"name\", offset: 0x00000001", Nil))
tapirCodecWithHexDump.decode("{}") should matchPattern {
case DecodeResult.Error(_, JsonDecodeException(errs, _: JsonReaderException)) if errs.head.msg.contains("buf:") =>
}
error.underlying shouldBe a[JsonReaderException]
}

Expand Down

0 comments on commit 61c9450

Please sign in to comment.