All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.mitallast.nsq.protocol.JsonParser.scala Maven / Gradle / Ivy

The newest version!
package com.github.mitallast.nsq.protocol

object JsonParser {
  sealed trait token
  case object start extends token
  case object startObject extends token
  case object endObject extends token
  case object startArray extends token
  case object endArray extends token
  case class valueString(name: String) extends token
  case class valueLong(name: Long) extends token
  case class valueBoolean(name: Boolean) extends token
}

class JsonParser(input: String) {

  import JsonParser._

  private val iterator = input.iterator

  private var last: token = start

  def next(): token = {
    last = iterator.next() match {
      case '{' ⇒ startObject
      case '[' ⇒ startArray
      case ']' ⇒ endArray
      case '}' ⇒ endObject
      case ':' ⇒ next()
      case ',' ⇒ next()
      case ' ' ⇒ next()
      case '"' ⇒
        val name = iterator.takeWhile(_ != '"').mkString
        valueString(name)
      case 't' ⇒
        assert(iterator.next() == 'r')
        assert(iterator.next() == 'u')
        assert(iterator.next() == 'e')
        valueBoolean(true)
      case 'f' ⇒
        assert(iterator.next() == 'a')
        assert(iterator.next() == 'l')
        assert(iterator.next() == 's')
        assert(iterator.next() == 'e')
        valueBoolean(false)
      case d if d.isDigit ⇒
        val value = d + iterator.takeWhile(_.isDigit).mkString
        valueLong(value.toInt)
    }
    last
  }

  def skipField(): Unit = {
    next() match {
      case JsonParser.startObject ⇒
        skipObject()
      case JsonParser.startArray ⇒
        skipArray()
      case _: valueString ⇒
      case _: valueLong ⇒
      case _: valueBoolean ⇒
      case token ⇒ throw new RuntimeException("unexpected token: " + token)
    }
  }

  def skipObject(): Unit = {
    while (true) {
      next() match {
        case _: valueString ⇒ skipField()
        case JsonParser.endObject ⇒
          return
        case token ⇒ throw new RuntimeException("unexpected token: " + token)
      }
    }
  }

  def skipArray(): Unit = {
    while (true) {
      next() match {
        case JsonParser.startObject ⇒ skipObject()
        case JsonParser.startArray ⇒ skipArray()
        case _: valueString ⇒ // ignore
        case _: valueLong ⇒ // ignore
        case _: valueBoolean ⇒ // ignore
        case JsonParser.endArray ⇒
          return
        case token ⇒ throw new RuntimeException("unexpected token: " + token)
      }
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy