Codebase list jawn / 766de4e support / argonaut / src / main / scala / Parser.scala
766de4e

Tree @766de4e (Download .tar.gz)

Parser.scala @766de4eraw · history · blame

package jawn
package support.argonaut

import scala.collection.mutable
import argonaut._

object Parser extends SupportParser[Json] {
  implicit val facade: Facade[Json] =
    new Facade[Json] {
      def jnull() = Json.jNull
      def jfalse() = Json.jFalse
      def jtrue() = Json.jTrue

      def jnum(s: CharSequence, decIndex: Int, expIndex: Int) =
        Json.jNumber(JsonNumber.unsafeDecimal(s.toString))
      def jstring(s: CharSequence) = Json.jString(s.toString)

      def singleContext() = new FContext[Json] {
        var value: Json = null
        def add(s: CharSequence) { value = jstring(s) }
        def add(v: Json) { value = v }
        def finish: Json = value
        def isObj: Boolean = false
      }

      def arrayContext() = new FContext[Json] {
        val vs = mutable.ListBuffer.empty[Json]
        def add(s: CharSequence) { vs += jstring(s) }
        def add(v: Json) { vs += v }
        def finish: Json = Json.jArray(vs.toList)
        def isObj: Boolean = false
      }

      def objectContext() = new FContext[Json] {
        var key: String = null
        var vs = JsonObject.empty
        def add(s: CharSequence): Unit =
          if (key == null) { key = s.toString } else { vs = vs + (key, jstring(s)); key = null }
        def add(v: Json): Unit =
        { vs = vs + (key, v); key = null }
        def finish = Json.jObject(vs)
        def isObj = true
      }
    }
}