Skip to content

Commit

Permalink
Clean up of zio-json codecs for enums
Browse files Browse the repository at this point in the history
  • Loading branch information
plokhotnyuk committed Jan 25, 2025
1 parent 4b6f4ac commit 863527b
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,10 @@ class ArrayOfEnumsWriting extends ArrayOfEnumsBenchmark {

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

obj.toJson(ZioJsonCodecs.arrayOfEnumsC3c.encoder).getBytes(UTF_8)
obj.toJson.getBytes(UTF_8)
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.github.plokhotnyuk.jsoniter_scala.benchmark

import com.github.plokhotnyuk.jsoniter_scala.benchmark.SuitEnum.SuitEnum
import zio.json.JsonDecoder.{JsonError, UnsafeJson}
import zio.json.internal.{Lexer, RetractReader, Write}
import zio.json.{DeriveJsonCodec, JsonCodec, JsonCodecConfiguration, JsonDecoder, JsonEncoder}
import zio.json.JsonDecoder.JsonError
import zio.json.internal.{Lexer, RetractReader, StringMatrix, Write}
import zio.json.{DeriveJsonCodec, JsonCodec, JsonDecoder, JsonEncoder}
import java.util.Base64
import scala.collection.immutable.ArraySeq
import scala.reflect.ClassTag

object ZioJsonCodecs {
implicit val adtC3c: JsonCodec[ADTBase] = DeriveJsonCodec.gen
Expand Down Expand Up @@ -115,34 +114,31 @@ object ZioJsonCodecs {
out.write('"')
}
}, new JsonDecoder[SuitADT] {
private[this] val m = Map(
"Hearts" -> Hearts,
"Spades" -> Spades,
"Diamonds" -> Diamonds,
"Clubs" -> Clubs)
private[this] val values = Array(Hearts, Spades, Diamonds, Clubs)
private[this] val matrix = new StringMatrix(values.map(_.toString))

override def unsafeDecode(trace: List[JsonError], in: RetractReader): SuitADT = {
val idx = Lexer.enumeration(trace, in, matrix)
if (idx == -1) Lexer.error("SuitADT", trace)
values(idx)
}
})
implicit val enumsC3c: JsonCodec[SuitEnum] = new JsonCodec(new JsonEncoder[SuitEnum] {
override def unsafeEncode(a: SuitEnum, indent: Option[Int], out: Write): Unit = {
out.write('"')
out.write(a.toString)
out.write('"')
}
}, new JsonDecoder[SuitEnum] {
private[this] val values = SuitEnum.values.toArray
private[this] val matrix = new StringMatrix(values.map(_.toString))

override def unsafeDecode(trace: List[JsonError], in: RetractReader): SuitADT =
m.getOrElse(Lexer.string(trace, in).toString, throwError("SuitADT", trace))
})
implicit val arrayOfEnumsC3c: JsonCodec[Array[SuitEnum]] = new JsonCodec(
JsonEncoder.array[SuitEnum]({ (a: SuitEnum, _: Option[Int], out: Write) =>
out.write('"')
out.write(a.toString)
out.write('"')
}, ClassTag(classOf[SuitEnum])), JsonDecoder.array[SuitEnum](new JsonDecoder[SuitEnum] {
override def unsafeDecode(trace: List[JsonError], in: RetractReader): SuitEnum = {
val s = Lexer.string(trace, in).toString
var v: SuitEnum = null
try v = SuitEnum.withName(s) catch {
case _: NoSuchElementException =>
}
if (v eq null) throwError("SuitEnum", trace)
v
val idx = Lexer.enumeration(trace, in, matrix)
if (idx == -1) Lexer.error("SuitEnum", trace)
values(idx)
}
}, ClassTag(classOf[SuitEnum])))
})
implicit val arraySeqOfBooleansD5r: JsonDecoder[ArraySeq[Boolean]] =
JsonDecoder.array[Boolean].map(ArraySeq.unsafeWrapArray)

private[this] def throwError(msg: String, trace: List[JsonError]): Nothing =
throw UnsafeJson(JsonError.Message(msg) :: trace)
}

0 comments on commit 863527b

Please sign in to comment.