Skip to content

Commit

Permalink
make TokenWriterProducer compatible with jsoniter
Browse files Browse the repository at this point in the history
  • Loading branch information
goshacodes committed Feb 2, 2025
1 parent 790f7d7 commit 835c8f1
Show file tree
Hide file tree
Showing 9 changed files with 40 additions and 50 deletions.
9 changes: 2 additions & 7 deletions modules/core/src/main/scala/tethys/commons/RawJson.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,7 @@ object RawJson {
): JsonReader[RawJson] = new JsonReader[RawJson] {
override def read(
it: TokenIterator
)(implicit fieldName: FieldName): RawJson = {
val stringWriter = new StringWriter()
val tokenWriter: TokenWriter = tokenWriterProducer.forWriter(stringWriter)
JsonStreaming.streamValue(it, tokenWriter)
tokenWriter.flush()
RawJson(stringWriter.toString)
}
)(implicit fieldName: FieldName): RawJson =
RawJson(tokenWriterProducer.withTokenWriter(JsonStreaming.streamValue(it, _)))
}
}
17 changes: 4 additions & 13 deletions modules/core/src/main/scala/tethys/package.scala
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import java.io.{Reader, StringReader, StringWriter, Writer}
import java.io.{Reader, StringReader}

import tethys.readers.{FieldName, ReaderError}
import tethys.readers.tokens.{TokenIterator, TokenIteratorProducer}
Expand All @@ -18,11 +18,8 @@ package object tethys {
def asJson(implicit
jsonWriter: JsonWriter[A],
tokenWriterProducer: TokenWriterProducer
): String = {
val stringWriter = new StringWriter()
writeJson(tokenWriterProducer.forWriter(stringWriter))
stringWriter.toString
}
): String =
tokenWriterProducer.withTokenWriter(jsonWriter.write(a, _))

def asJsonWith(
jsonWriter: JsonWriter[A]
Expand All @@ -31,7 +28,7 @@ package object tethys {
}

def writeJson(
tokenWriter: TokenWriter
tokenWriter: TokenWriter with TokenWriter.Flushing
)(implicit jsonWriter: JsonWriter[A]): Unit = {
try jsonWriter.write(a, tokenWriter)
finally {
Expand All @@ -40,12 +37,6 @@ package object tethys {
}
}

implicit class WriterOps(val w: Writer) extends AnyVal {
def toTokenWriter(implicit
tokenWriterProducer: TokenWriterProducer
): TokenWriter = tokenWriterProducer.forWriter(w)
}

implicit class StringReaderOps(val json: String) extends AnyVal {
def jsonAs[A](implicit
jsonReader: JsonReader[A],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import tethys.readers.tokens.TokenIteratorProducer

import scala.collection.mutable

class SimpleTokenWriter extends TokenWriter {
class SimpleTokenWriter extends TokenWriter with TokenWriter.Flushing {
val tokens: mutable.ArrayBuffer[TokenNode] = mutable.ArrayBuffer.empty

override def writeArrayStart(): SimpleTokenWriter.this.type = append(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,11 @@ trait TokenWriter {

@throws[UnsupportedOperationException]
def writeRawJson(json: String): this.type
}

def close(): Unit

def flush(): Unit
object TokenWriter {
trait Flushing {
def flush(): Unit
def close(): Unit
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tethys.writers.tokens

import java.io.Writer

trait TokenWriterProducer {
def forWriter(writer: Writer): TokenWriter
type ExactTokenWriter <: TokenWriter
def withTokenWriter(writer: ExactTokenWriter => Unit): String
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package tethys.jackson
import com.fasterxml.jackson.core.JsonGenerator
import tethys.writers.tokens.TokenWriter

class JacksonTokenWriter(jsonGenerator: JsonGenerator) extends TokenWriter {
class JacksonTokenWriter(jsonGenerator: JsonGenerator) extends TokenWriter with TokenWriter.Flushing {
override def writeArrayStart(): JacksonTokenWriter.this.type = {
jsonGenerator.writeStartArray()
this
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package tethys

import java.io.{Reader, Writer}

import com.fasterxml.jackson.core.JsonFactory
import com.fasterxml.jackson.core.{JsonFactory, JsonGenerator}
import tethys.readers.{FieldName, ReaderError}
import tethys.readers.tokens.{TokenIterator, TokenIteratorProducer}
import tethys.writers.tokens.{TokenWriter, TokenWriterProducer}
Expand All @@ -14,14 +14,24 @@ package object jackson {
f
}

implicit def jacksonTokenWriterProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
): TokenWriterProducer = new TokenWriterProducer {
override def forWriter(writer: Writer): TokenWriter = {
new JacksonTokenWriter(jsonFactory.createGenerator(writer))
class JacksonTokenWriterProducer(
jsonFactory: JsonFactory,
configure: JsonGenerator => JsonGenerator
) extends TokenWriterProducer {
type ExactTokenWriter = JacksonTokenWriter

override def withTokenWriter(write: JacksonTokenWriter => Unit): String = {
val stringWriter = new java.io.StringWriter()
val tw = new JacksonTokenWriter(configure(jsonFactory.createGenerator(stringWriter)))
try write(tw) finally tw.flush()
stringWriter.toString
}
}

implicit def jacksonTokenWriterProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
): JacksonTokenWriterProducer = new JacksonTokenWriterProducer(jsonFactory, identity)

implicit def jacksonTokenIteratorProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
): TokenIteratorProducer = new TokenIteratorProducer {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,8 @@ import tethys.writers.tokens.{TokenWriter, TokenWriterProducer}
package object pretty {
implicit def prettyJacksonTokenWriterProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
): TokenWriterProducer = new TokenWriterProducer {
override def forWriter(writer: Writer): TokenWriter = {
new JacksonTokenWriter(
jsonFactory.createGenerator(writer).useDefaultPrettyPrinter()
)
}
}
): JacksonTokenWriterProducer =
new tethys.jackson.JacksonTokenWriterProducer(jsonFactory, _.useDefaultPrettyPrinter())

implicit def jacksonTokenIteratorProducer(implicit
jsonFactory: JsonFactory = defaultJsonFactory
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package tethys.jackson

import java.io.StringWriter

import org.scalatest.matchers.should.Matchers
import org.scalatest.flatspec.AnyFlatSpec
import tethys._
import tethys.writers.tokens.TokenWriter

class JacksonTokenWriterTest extends AnyFlatSpec with Matchers {

def iterate(fun: (TokenWriter) => Unit): String = {
val sw = new StringWriter()
val tokenWriter = sw.toTokenWriter
fun(tokenWriter)
tokenWriter.close()
sw.toString
}
def iterate(fun: TokenWriter => Unit): String =
implicitly[JacksonTokenWriterProducer]
.withTokenWriter { tokenWriter =>
fun(tokenWriter)
tokenWriter.close()
}

behavior of "JacksonTokenWriter"

Expand Down

0 comments on commit 835c8f1

Please sign in to comment.