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

com.github.chengpohi.parser.CollectionParser.scala Maven / Gradle / Ivy

The newest version!
package com.github.chengpohi.parser

import com.github.chengpohi.collection.JsonCollection
import fastparse.noApi._
import org.apache.commons.lang3.StringEscapeUtils

/**
  * elasticdsl
  * Created by chengpohi on 2/1/16.
  */
class CollectionParser extends Basic {

  import WhitespaceApi._

  val StringChars = NamedFunction(!"\"".contains(_: Char), "StringChars")
  val AlphaChars = NamedFunction(!"\"\\?".contains(_: Char), "StringChars")
  val CollectionChars = NamedFunction(!"[],()\"\\".contains(_: Char), "CollectionChars")

  val strChars = P(CharsWhile(StringChars))
  val alphaChars = P(CharsWhile(AlphaChars))
  val collectionChars = P(CharsWhile(CollectionChars))
  val variableChars = P(CharIn('a' to 'z', 'A' to 'Z'))

  val hexDigit = P(CharIn('0' to '9', 'a' to 'f', 'A' to 'F'))
  val unicodeEscape = P("u" ~ hexDigit ~ hexDigit ~ hexDigit ~ hexDigit)
  val escape = P("\\" ~ (CharIn("\"/\\bfnrt") | unicodeEscape))
  //val string =
  //P("\"" ~/ (strChars | escape).rep.! ~ "\"").map(i => JsonCollection.Str(StringEscapeUtils.unescapeJava(i)))
  val string = P("\"" ~ strChars.rep(1).! ~ "\"").map(i => JsonCollection.Str(StringEscapeUtils.unescapeJava(i)))


  val variable = P(variableChars.rep(1)).!.map(s => "$" + s).map(JsonCollection.Str)
  //val parameter: P[String] = P(space ~ string ~ ",".? ~ space)
  val strOrVar = P(string | variable)
  val Digits = NamedFunction('0' to '9' contains (_: Char), "Digits")
  val digits = P(CharsWhile(Digits))
  val exponent = P(CharIn("eE") ~ CharIn("+-").? ~ digits)
  val fractional = P("." ~ digits)
  val integral = P("0" | CharIn('1' to '9') ~ digits.?)

  val number = P(CharIn("+-").? ~ integral ~ fractional.? ~ exponent.?).!.map(
    x => JsonCollection.Num(x.toDouble)
  )
  val pair = P(string.map(_.value) ~/ ":" ~/ jsonExpr)
  val obj = P("{" ~/ pair.rep(sep = ",".~/) ~ "}").map(JsonCollection.Obj(_: _*))

  val `null` = P("null").map(_ => JsonCollection.Null)
  val `false` = P("false").map(_ => JsonCollection.False)
  val `true` = P("true").map(_ => JsonCollection.True)


  val tuple = P("(" ~ jsonExpr.rep(1, sep = ",".~/) ~ ")").map(JsonCollection.Arr(_: _*))
  val array = P("[" ~ jsonExpr.rep(1, sep = ",".~/) ~ "]").map(JsonCollection.Arr(_: _*))

  val jsonExpr: P[JsonCollection.Val] = P(obj | array | tuple | string | `true` | `false` | `null` | number)
  val ioParser: P[Seq[JsonCollection.Val]] = P(jsonExpr.rep(1))
}

case class NamedFunction[T, V](f: T => V, name: String) extends (T => V) {
  def apply(t: T): V = f(t)

  override def toString(): String = name
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy