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

scalapb_circe.StructFormat.scala Maven / Gradle / Ivy

package scalapb_circe

import com.google.protobuf.struct.Value.Kind
import com.google.protobuf.struct
import io.circe.{Json, JsonObject}
import scalapb_json._

object StructFormat {
  def structValueWriter(v: struct.Value): Json =
    v.kind match {
      case Kind.Empty => Json.Null
      case Kind.NullValue(_) => Json.Null
      case Kind.NumberValue(value) => Json.fromDoubleOrString(value)
      case Kind.StringValue(value) => Json.fromString(value)
      case Kind.BoolValue(value) => Json.fromBoolean(value)
      case Kind.StructValue(value) => structWriter(value)
      case Kind.ListValue(value) => listValueWriter(value)
    }

  def structValueParser(v: Json): struct.Value = {
    val kind: struct.Value.Kind = v.fold(
      jsonNull = Kind.NullValue(struct.NullValue.NULL_VALUE),
      jsonBoolean = value => Kind.BoolValue(value = value),
      jsonNumber = x => Kind.NumberValue(value = x.toDouble),
      jsonString = x => Kind.StringValue(value = x),
      jsonArray = x => Kind.ListValue(listValueParser(x)),
      jsonObject = x => Kind.StructValue(value = structParser(x))
    )
    struct.Value(kind = kind)
  }

  def structParser(v: JsonObject): struct.Struct = {
    struct.Struct(fields = v.toMap.map(kv => (kv._1, structValueParser(kv._2))))
  }

  def structParser(v: Json): struct.Struct =
    v.asObject match {
      case Some(x) => structParser(x)
      case None => throw new JsonFormatException("Expected an object")
    }

  def structWriter(v: struct.Struct): Json =
    Json.obj(v.fields.iterator.map {
      case (x, y) => x -> structValueWriter(y)
    }.toList: _*)

  def listValueParser(json: Seq[Json]): struct.ListValue =
    com.google.protobuf.struct.ListValue(json.map(structValueParser))

  def listValueParser(json: Json): struct.ListValue =
    json.asArray match {
      case Some(v) =>
        listValueParser(v)
      case None =>
        throw new JsonFormatException("Expected an array")
    }

  def listValueWriter(v: struct.ListValue): Json =
    Json.fromValues(v.values.map(structValueWriter))

  def nullValueParser(v: Json): struct.NullValue = {
    if (v.isNull)
      com.google.protobuf.struct.NullValue.NULL_VALUE
    else
      throw new JsonFormatException("Expected a null")
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy