diff --git a/build.sbt b/build.sbt index fe67132b8..4f17c7b7a 100644 --- a/build.sbt +++ b/build.sbt @@ -138,18 +138,18 @@ lazy val zioJson = crossProject(JSPlatform, JVMPlatform, NativePlatform) val tparams = (1 to i).map(p => s"A$p").mkString(", ") val implicits = (1 to i).map(p => s"A$p: JsonDecoder[A$p]").mkString(", ") val work = (1 to i) - .map(p => s"val a$p = A$p.unsafeDecode(trace :+ traces($p), in)") + .map(p => s"val a$p = A$p.unsafeDecode(traces(${p - 1}) :: trace, in)") .mkString("\n Lexer.char(trace, in, ',')\n ") val returns = (1 to i).map(p => s"a$p").mkString(", ") s"""implicit def tuple$i[$tparams](implicit $implicits): JsonDecoder[Tuple$i[$tparams]] = | new JsonDecoder[Tuple$i[$tparams]] { - | val traces: Array[JsonError] = (0 to $i).map(JsonError.ArrayAccess(_)).toArray + | private[this] val traces: Array[JsonError] = (0 to ${i - 1}).map(JsonError.ArrayAccess(_)).toArray | def unsafeDecode(trace: List[JsonError], in: RetractReader): Tuple$i[$tparams] = { | Lexer.char(trace, in, '[') | $work | Lexer.char(trace, in, ']') - | Tuple$i($returns) + | new Tuple$i($returns) | } | }""".stripMargin } diff --git a/zio-json/shared/src/test/scala/zio/json/DecoderSpec.scala b/zio-json/shared/src/test/scala/zio/json/DecoderSpec.scala index 55eb0d051..a2bfb3012 100644 --- a/zio-json/shared/src/test/scala/zio/json/DecoderSpec.scala +++ b/zio-json/shared/src/test/scala/zio/json/DecoderSpec.scala @@ -54,6 +54,13 @@ object DecoderSpec extends ZIOSpecDefault { forall(isRight(isRight(equalTo(2)))) ) }, + test("tuples") { + assert("""["a",3]""".fromJson[(String, Int)])(isRight(equalTo(("a", 3)))) + assert("""["a","b"]""".fromJson[(String, Int)])(isLeft(equalTo("[1](expected a number, got 'b')"))) + assert("""[[0.1,0.2],[0.3,0.4],[-0.3,-]]""".fromJson[Seq[(Double, Double)]])( + isLeft(equalTo("[2][1](expected a Double)")) + ) + }, test("parameterless products") { import exampleproducts._