Skip to content

Commit

Permalink
Switch to using the AppendContainers throughout the rendering pipeline.
Browse files Browse the repository at this point in the history
  • Loading branch information
farmdawgnation committed Jul 12, 2015
1 parent 3c85525 commit dcd6176
Showing 1 changed file with 17 additions and 14 deletions.
31 changes: 17 additions & 14 deletions core/json/src/main/scala/net/liftweb/json/JsonAST.scala
Original file line number Diff line number Diff line change
Expand Up @@ -812,12 +812,12 @@ object JsonAST {
case class JField(name: String, value: JValue)

private[json] def quote(s: String): String = {
val buf = new StringBuilder
val buf = StringBuilderAppendContainer(new StringBuilder)
appendEscapedString(buf, s)
buf.toString
}

private def appendEscapedString(buf: StringBuilder, s: String) {
private def appendEscapedString(buf: AppendContainer[_], s: String) {
for (i <- 0 until s.length) {
val c = s.charAt(i)
val strReplacement = c match {
Expand All @@ -843,16 +843,19 @@ object JsonAST {
}

sealed trait AppendContainer[T] {
def append(thing: Char): T
def append(thing: String): T
def append(thing: Char): AppendContainer[T]
def append(thing: String): AppendContainer[T]
def toString: String
}
case class StringBuilderAppendContainer(builder: StringBuilder) extends AppendContainer[StringBuilder] {
def append(thing: Char) = builder.append(thing)
def append(thing: String) = builder.append(thing)
override def append(thing: Char) = StringBuilderAppendContainer(builder.append(thing))
override def append(thing: String) = StringBuilderAppendContainer(builder.append(thing))
override def toString = builder.toString
}
case class AppendableAppendContainer(appendable: Appendable) extends AppendContainer[Appendable] {
def append(thing: Char) = appendable.append(thing)
def append(thing: String) = appendable.append(thing)
override def append(thing: Char) = AppendableAppendContainer(appendable.append(thing))
override def append(thing: String) = AppendableAppendContainer(appendable.append(thing))
override def toString = appendable.toString
}

object RenderSettings {
Expand All @@ -878,16 +881,16 @@ object JsonAST {
render(value, RenderSettings.compact)
}

def render(value: JValue, settings: RenderSettings): String = {
bufRender(value, new StringBuilder, settings).toString()
def render(value: JValue, settings: RenderSettings, appendContainer: AppendContainer[_] = StringBuilderAppendContainer(new StringBuilder())): String = {
bufRender(value, appendContainer, settings).toString()
}

/**
*
* @param value the JSON to render
* @param buf the buffer to render the JSON into. may not be empty
*/
private def bufRender(value: JValue, buf: StringBuilder, settings: RenderSettings, indentLevel: Int = 0): StringBuilder = value match {
private def bufRender(value: JValue, buf: AppendContainer[_], settings: RenderSettings, indentLevel: Int = 0): AppendContainer[_] = value match {
case null => buf.append("null")
case JBool(true) => buf.append("true")
case JBool(false) => buf.append("false")
Expand All @@ -901,7 +904,7 @@ object JsonAST {
case JNothing => sys.error("can't render 'nothing'") //TODO: this should not throw an exception
}

private def bufRenderArr(values: List[JValue], buf: StringBuilder, settings: RenderSettings, indentLevel: Int): StringBuilder = {
private def bufRenderArr(values: List[JValue], buf: AppendContainer[_], settings: RenderSettings, indentLevel: Int): AppendContainer[_] = {
var firstEntry = true
val currentIndent = indentLevel + settings.indent

Expand Down Expand Up @@ -937,7 +940,7 @@ object JsonAST {
buf
}

private def bufRenderObj(fields: List[JField], buf: StringBuilder, settings: RenderSettings, indentLevel: Int): StringBuilder = {
private def bufRenderObj(fields: List[JField], buf: AppendContainer[_], settings: RenderSettings, indentLevel: Int): AppendContainer[_] = {
var firstEntry = true
val currentIndent = indentLevel + settings.indent

Expand Down Expand Up @@ -979,7 +982,7 @@ object JsonAST {
buf
}

private def bufQuote(s: String, buf: StringBuilder): StringBuilder = {
private def bufQuote(s: String, buf: AppendContainer[_]): AppendContainer[_] = {
buf.append('"') //open quote
appendEscapedString(buf, s)
buf.append('"') //close quote
Expand Down

0 comments on commit dcd6176

Please sign in to comment.