Skip to content

Commit 863527b

Browse files
committed
Clean up of zio-json codecs for enums
1 parent 4b6f4ac commit 863527b

File tree

2 files changed

+27
-30
lines changed

2 files changed

+27
-30
lines changed

jsoniter-scala-benchmark/shared/src/main/scala-2/com/github/plokhotnyuk/jsoniter_scala/benchmark/ArrayOfEnumsWriting.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,10 @@ class ArrayOfEnumsWriting extends ArrayOfEnumsBenchmark {
123123

124124
@Benchmark
125125
def zioJson(): Array[Byte] = {
126+
import com.github.plokhotnyuk.jsoniter_scala.benchmark.ZioJsonCodecs._
126127
import zio.json.EncoderOps
127128
import java.nio.charset.StandardCharsets.UTF_8
128129

129-
obj.toJson(ZioJsonCodecs.arrayOfEnumsC3c.encoder).getBytes(UTF_8)
130+
obj.toJson.getBytes(UTF_8)
130131
}
131132
}

jsoniter-scala-benchmark/shared/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/benchmark/ZioJsonCodecs.scala

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.github.plokhotnyuk.jsoniter_scala.benchmark
22

33
import com.github.plokhotnyuk.jsoniter_scala.benchmark.SuitEnum.SuitEnum
4-
import zio.json.JsonDecoder.{JsonError, UnsafeJson}
5-
import zio.json.internal.{Lexer, RetractReader, Write}
6-
import zio.json.{DeriveJsonCodec, JsonCodec, JsonCodecConfiguration, JsonDecoder, JsonEncoder}
4+
import zio.json.JsonDecoder.JsonError
5+
import zio.json.internal.{Lexer, RetractReader, StringMatrix, Write}
6+
import zio.json.{DeriveJsonCodec, JsonCodec, JsonDecoder, JsonEncoder}
77
import java.util.Base64
88
import scala.collection.immutable.ArraySeq
9-
import scala.reflect.ClassTag
109

1110
object ZioJsonCodecs {
1211
implicit val adtC3c: JsonCodec[ADTBase] = DeriveJsonCodec.gen
@@ -115,34 +114,31 @@ object ZioJsonCodecs {
115114
out.write('"')
116115
}
117116
}, new JsonDecoder[SuitADT] {
118-
private[this] val m = Map(
119-
"Hearts" -> Hearts,
120-
"Spades" -> Spades,
121-
"Diamonds" -> Diamonds,
122-
"Clubs" -> Clubs)
117+
private[this] val values = Array(Hearts, Spades, Diamonds, Clubs)
118+
private[this] val matrix = new StringMatrix(values.map(_.toString))
119+
120+
override def unsafeDecode(trace: List[JsonError], in: RetractReader): SuitADT = {
121+
val idx = Lexer.enumeration(trace, in, matrix)
122+
if (idx == -1) Lexer.error("SuitADT", trace)
123+
values(idx)
124+
}
125+
})
126+
implicit val enumsC3c: JsonCodec[SuitEnum] = new JsonCodec(new JsonEncoder[SuitEnum] {
127+
override def unsafeEncode(a: SuitEnum, indent: Option[Int], out: Write): Unit = {
128+
out.write('"')
129+
out.write(a.toString)
130+
out.write('"')
131+
}
132+
}, new JsonDecoder[SuitEnum] {
133+
private[this] val values = SuitEnum.values.toArray
134+
private[this] val matrix = new StringMatrix(values.map(_.toString))
123135

124-
override def unsafeDecode(trace: List[JsonError], in: RetractReader): SuitADT =
125-
m.getOrElse(Lexer.string(trace, in).toString, throwError("SuitADT", trace))
126-
})
127-
implicit val arrayOfEnumsC3c: JsonCodec[Array[SuitEnum]] = new JsonCodec(
128-
JsonEncoder.array[SuitEnum]({ (a: SuitEnum, _: Option[Int], out: Write) =>
129-
out.write('"')
130-
out.write(a.toString)
131-
out.write('"')
132-
}, ClassTag(classOf[SuitEnum])), JsonDecoder.array[SuitEnum](new JsonDecoder[SuitEnum] {
133136
override def unsafeDecode(trace: List[JsonError], in: RetractReader): SuitEnum = {
134-
val s = Lexer.string(trace, in).toString
135-
var v: SuitEnum = null
136-
try v = SuitEnum.withName(s) catch {
137-
case _: NoSuchElementException =>
138-
}
139-
if (v eq null) throwError("SuitEnum", trace)
140-
v
137+
val idx = Lexer.enumeration(trace, in, matrix)
138+
if (idx == -1) Lexer.error("SuitEnum", trace)
139+
values(idx)
141140
}
142-
}, ClassTag(classOf[SuitEnum])))
141+
})
143142
implicit val arraySeqOfBooleansD5r: JsonDecoder[ArraySeq[Boolean]] =
144143
JsonDecoder.array[Boolean].map(ArraySeq.unsafeWrapArray)
145-
146-
private[this] def throwError(msg: String, trace: List[JsonError]): Nothing =
147-
throw UnsafeJson(JsonError.Message(msg) :: trace)
148144
}

0 commit comments

Comments
 (0)