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

com.dslplatform.json.runtime.ScalaMapImmutableDecoder.scala Maven / Gradle / Ivy

The newest version!
package com.dslplatform.json
package runtime

import java.lang.reflect.Type

final class ScalaMapImmutableDecoder[K, V](
  manifest: Type,
  keyDecoder: JsonReader.ReadObject[K],
  valueDecoder: JsonReader.ReadObject[V]
) extends JsonReader.ReadObject[Map[K, V]] {
  require(manifest ne null, "manifest can't be null")
  require(keyDecoder ne null, "keyDecoder can't be null")
  require(valueDecoder ne null, "valueDecoder can't be null")

  override def read(reader: JsonReader[_]): Map[K, V] = {
    if (reader.last != '{') throw reader.newParseError("Expecting '{' for map start")
    val builder = Map.newBuilder[K, V]
    if (reader.getNextToken() == '}') builder.result()
    else {
      var key = keyDecoder.read(reader)
      if (key == null) {
        throw reader.newParseErrorFormat(
          "Null value detected for key element of map",
          0,
          "Null value detected for key element of %s", manifest.getTypeName)
      }
      if (reader.getNextToken() != ':') throw reader.newParseError("Expecting ':' after attribute name")
      reader.getNextToken()
      var value = valueDecoder.read(reader)
      builder += key -> value
      while (reader.getNextToken() == ',') {
        reader.getNextToken()
        key = keyDecoder.read(reader)
        if (key == null) {
          throw reader.newParseErrorFormat(
            "Null value detected for key element of map",
            0,
            "Null value detected for key element of %s", manifest.getTypeName)
        }
        if (reader.getNextToken() != ':') throw reader.newParseError("Expecting ':' after attribute name")
        reader.getNextToken()
        value = valueDecoder.read(reader)
        builder += key -> value
      }
      if (reader.last != '}') throw reader.newParseError("Expecting '}' for map end")
      builder.result()
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy