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

sjsonnew.FlatUnionFormats.scala Maven / Gradle / Ivy

The newest version!
// auto-generated by sbt-boilerplate
package sjsonnew

import scala.reflect.ClassTag

trait FlatUnionFormats {
  private[this] type JF[A] = JsonFormat[A] // simple alias for reduced verbosity

  /** *BEWARE*:  A1 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat1[U, A1 :JF: ClassTag]: JF[U] =
    flatUnionFormat1[U, A1]("type")
  /** *BEWARE*:  A1,  A2 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat2[U, A1 :JF: ClassTag, A2 :JF: ClassTag]: JF[U] =
    flatUnionFormat2[U, A1, A2]("type")
  /** *BEWARE*:  A1,  A2,  A3 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat3[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag]: JF[U] =
    flatUnionFormat3[U, A1, A2, A3]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat4[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag]: JF[U] =
    flatUnionFormat4[U, A1, A2, A3, A4]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat5[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag]: JF[U] =
    flatUnionFormat5[U, A1, A2, A3, A4, A5]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat6[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag]: JF[U] =
    flatUnionFormat6[U, A1, A2, A3, A4, A5, A6]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat7[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag]: JF[U] =
    flatUnionFormat7[U, A1, A2, A3, A4, A5, A6, A7]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat8[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag]: JF[U] =
    flatUnionFormat8[U, A1, A2, A3, A4, A5, A6, A7, A8]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat9[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag]: JF[U] =
    flatUnionFormat9[U, A1, A2, A3, A4, A5, A6, A7, A8, A9]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat10[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag]: JF[U] =
    flatUnionFormat10[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat11[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag]: JF[U] =
    flatUnionFormat11[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat12[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag]: JF[U] =
    flatUnionFormat12[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat13[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag]: JF[U] =
    flatUnionFormat13[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat14[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag]: JF[U] =
    flatUnionFormat14[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat15[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag]: JF[U] =
    flatUnionFormat15[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat16[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag]: JF[U] =
    flatUnionFormat16[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat17[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag]: JF[U] =
    flatUnionFormat17[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat18[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag]: JF[U] =
    flatUnionFormat18[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18,  A19 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat19[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag, A19 :JF: ClassTag]: JF[U] =
    flatUnionFormat19[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18,  A19,  A20 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat20[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag, A19 :JF: ClassTag, A20 :JF: ClassTag]: JF[U] =
    flatUnionFormat20[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18,  A19,  A20,  A21 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat21[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag, A19 :JF: ClassTag, A20 :JF: ClassTag, A21 :JF: ClassTag]: JF[U] =
    flatUnionFormat21[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21]("type")
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18,  A19,  A20,  A21,  A22 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat22[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag, A19 :JF: ClassTag, A20 :JF: ClassTag, A21 :JF: ClassTag, A22 :JF: ClassTag]: JF[U] =
    flatUnionFormat22[U, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22]("type")
  /** *BEWARE*:  A1 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat1[U, A1 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat2[U, A1 :JF: ClassTag, A2 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat3[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat4[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat5[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat6[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat7[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat8[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat9[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat10[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat11[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat12[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat13[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat14[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat15[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]
    lazy val a15Format = implicitly[JF[A15]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)
    lazy val a15Name = className(implicitly[ClassTag[A15]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
        case x if implicitly[ClassTag[A15]].runtimeClass == x.getClass => a15Format.write(x.asInstanceOf[A15], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
            case x if a15Name == x => a15Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat16[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]
    lazy val a15Format = implicitly[JF[A15]]
    lazy val a16Format = implicitly[JF[A16]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)
    lazy val a15Name = className(implicitly[ClassTag[A15]].runtimeClass)
    lazy val a16Name = className(implicitly[ClassTag[A16]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
        case x if implicitly[ClassTag[A15]].runtimeClass == x.getClass => a15Format.write(x.asInstanceOf[A15], builder)
        case x if implicitly[ClassTag[A16]].runtimeClass == x.getClass => a16Format.write(x.asInstanceOf[A16], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
            case x if a15Name == x => a15Format.read(Some(js), unbuilder)
            case x if a16Name == x => a16Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat17[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]
    lazy val a15Format = implicitly[JF[A15]]
    lazy val a16Format = implicitly[JF[A16]]
    lazy val a17Format = implicitly[JF[A17]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)
    lazy val a15Name = className(implicitly[ClassTag[A15]].runtimeClass)
    lazy val a16Name = className(implicitly[ClassTag[A16]].runtimeClass)
    lazy val a17Name = className(implicitly[ClassTag[A17]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
        case x if implicitly[ClassTag[A15]].runtimeClass == x.getClass => a15Format.write(x.asInstanceOf[A15], builder)
        case x if implicitly[ClassTag[A16]].runtimeClass == x.getClass => a16Format.write(x.asInstanceOf[A16], builder)
        case x if implicitly[ClassTag[A17]].runtimeClass == x.getClass => a17Format.write(x.asInstanceOf[A17], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
            case x if a15Name == x => a15Format.read(Some(js), unbuilder)
            case x if a16Name == x => a16Format.read(Some(js), unbuilder)
            case x if a17Name == x => a17Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat18[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]
    lazy val a15Format = implicitly[JF[A15]]
    lazy val a16Format = implicitly[JF[A16]]
    lazy val a17Format = implicitly[JF[A17]]
    lazy val a18Format = implicitly[JF[A18]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)
    lazy val a15Name = className(implicitly[ClassTag[A15]].runtimeClass)
    lazy val a16Name = className(implicitly[ClassTag[A16]].runtimeClass)
    lazy val a17Name = className(implicitly[ClassTag[A17]].runtimeClass)
    lazy val a18Name = className(implicitly[ClassTag[A18]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
        case x if implicitly[ClassTag[A15]].runtimeClass == x.getClass => a15Format.write(x.asInstanceOf[A15], builder)
        case x if implicitly[ClassTag[A16]].runtimeClass == x.getClass => a16Format.write(x.asInstanceOf[A16], builder)
        case x if implicitly[ClassTag[A17]].runtimeClass == x.getClass => a17Format.write(x.asInstanceOf[A17], builder)
        case x if implicitly[ClassTag[A18]].runtimeClass == x.getClass => a18Format.write(x.asInstanceOf[A18], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
            case x if a15Name == x => a15Format.read(Some(js), unbuilder)
            case x if a16Name == x => a16Format.read(Some(js), unbuilder)
            case x if a17Name == x => a17Format.read(Some(js), unbuilder)
            case x if a18Name == x => a18Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18,  A19 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat19[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag, A19 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]
    lazy val a15Format = implicitly[JF[A15]]
    lazy val a16Format = implicitly[JF[A16]]
    lazy val a17Format = implicitly[JF[A17]]
    lazy val a18Format = implicitly[JF[A18]]
    lazy val a19Format = implicitly[JF[A19]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)
    lazy val a15Name = className(implicitly[ClassTag[A15]].runtimeClass)
    lazy val a16Name = className(implicitly[ClassTag[A16]].runtimeClass)
    lazy val a17Name = className(implicitly[ClassTag[A17]].runtimeClass)
    lazy val a18Name = className(implicitly[ClassTag[A18]].runtimeClass)
    lazy val a19Name = className(implicitly[ClassTag[A19]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
        case x if implicitly[ClassTag[A15]].runtimeClass == x.getClass => a15Format.write(x.asInstanceOf[A15], builder)
        case x if implicitly[ClassTag[A16]].runtimeClass == x.getClass => a16Format.write(x.asInstanceOf[A16], builder)
        case x if implicitly[ClassTag[A17]].runtimeClass == x.getClass => a17Format.write(x.asInstanceOf[A17], builder)
        case x if implicitly[ClassTag[A18]].runtimeClass == x.getClass => a18Format.write(x.asInstanceOf[A18], builder)
        case x if implicitly[ClassTag[A19]].runtimeClass == x.getClass => a19Format.write(x.asInstanceOf[A19], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
            case x if a15Name == x => a15Format.read(Some(js), unbuilder)
            case x if a16Name == x => a16Format.read(Some(js), unbuilder)
            case x if a17Name == x => a17Format.read(Some(js), unbuilder)
            case x if a18Name == x => a18Format.read(Some(js), unbuilder)
            case x if a19Name == x => a19Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18,  A19,  A20 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat20[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag, A19 :JF: ClassTag, A20 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]
    lazy val a15Format = implicitly[JF[A15]]
    lazy val a16Format = implicitly[JF[A16]]
    lazy val a17Format = implicitly[JF[A17]]
    lazy val a18Format = implicitly[JF[A18]]
    lazy val a19Format = implicitly[JF[A19]]
    lazy val a20Format = implicitly[JF[A20]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)
    lazy val a15Name = className(implicitly[ClassTag[A15]].runtimeClass)
    lazy val a16Name = className(implicitly[ClassTag[A16]].runtimeClass)
    lazy val a17Name = className(implicitly[ClassTag[A17]].runtimeClass)
    lazy val a18Name = className(implicitly[ClassTag[A18]].runtimeClass)
    lazy val a19Name = className(implicitly[ClassTag[A19]].runtimeClass)
    lazy val a20Name = className(implicitly[ClassTag[A20]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
        case x if implicitly[ClassTag[A15]].runtimeClass == x.getClass => a15Format.write(x.asInstanceOf[A15], builder)
        case x if implicitly[ClassTag[A16]].runtimeClass == x.getClass => a16Format.write(x.asInstanceOf[A16], builder)
        case x if implicitly[ClassTag[A17]].runtimeClass == x.getClass => a17Format.write(x.asInstanceOf[A17], builder)
        case x if implicitly[ClassTag[A18]].runtimeClass == x.getClass => a18Format.write(x.asInstanceOf[A18], builder)
        case x if implicitly[ClassTag[A19]].runtimeClass == x.getClass => a19Format.write(x.asInstanceOf[A19], builder)
        case x if implicitly[ClassTag[A20]].runtimeClass == x.getClass => a20Format.write(x.asInstanceOf[A20], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
            case x if a15Name == x => a15Format.read(Some(js), unbuilder)
            case x if a16Name == x => a16Format.read(Some(js), unbuilder)
            case x if a17Name == x => a17Format.read(Some(js), unbuilder)
            case x if a18Name == x => a18Format.read(Some(js), unbuilder)
            case x if a19Name == x => a19Format.read(Some(js), unbuilder)
            case x if a20Name == x => a20Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18,  A19,  A20,  A21 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat21[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag, A19 :JF: ClassTag, A20 :JF: ClassTag, A21 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]
    lazy val a15Format = implicitly[JF[A15]]
    lazy val a16Format = implicitly[JF[A16]]
    lazy val a17Format = implicitly[JF[A17]]
    lazy val a18Format = implicitly[JF[A18]]
    lazy val a19Format = implicitly[JF[A19]]
    lazy val a20Format = implicitly[JF[A20]]
    lazy val a21Format = implicitly[JF[A21]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)
    lazy val a15Name = className(implicitly[ClassTag[A15]].runtimeClass)
    lazy val a16Name = className(implicitly[ClassTag[A16]].runtimeClass)
    lazy val a17Name = className(implicitly[ClassTag[A17]].runtimeClass)
    lazy val a18Name = className(implicitly[ClassTag[A18]].runtimeClass)
    lazy val a19Name = className(implicitly[ClassTag[A19]].runtimeClass)
    lazy val a20Name = className(implicitly[ClassTag[A20]].runtimeClass)
    lazy val a21Name = className(implicitly[ClassTag[A21]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
        case x if implicitly[ClassTag[A15]].runtimeClass == x.getClass => a15Format.write(x.asInstanceOf[A15], builder)
        case x if implicitly[ClassTag[A16]].runtimeClass == x.getClass => a16Format.write(x.asInstanceOf[A16], builder)
        case x if implicitly[ClassTag[A17]].runtimeClass == x.getClass => a17Format.write(x.asInstanceOf[A17], builder)
        case x if implicitly[ClassTag[A18]].runtimeClass == x.getClass => a18Format.write(x.asInstanceOf[A18], builder)
        case x if implicitly[ClassTag[A19]].runtimeClass == x.getClass => a19Format.write(x.asInstanceOf[A19], builder)
        case x if implicitly[ClassTag[A20]].runtimeClass == x.getClass => a20Format.write(x.asInstanceOf[A20], builder)
        case x if implicitly[ClassTag[A21]].runtimeClass == x.getClass => a21Format.write(x.asInstanceOf[A21], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
            case x if a15Name == x => a15Format.read(Some(js), unbuilder)
            case x if a16Name == x => a16Format.read(Some(js), unbuilder)
            case x if a17Name == x => a17Format.read(Some(js), unbuilder)
            case x if a18Name == x => a18Format.read(Some(js), unbuilder)
            case x if a19Name == x => a19Format.read(Some(js), unbuilder)
            case x if a20Name == x => a20Format.read(Some(js), unbuilder)
            case x if a21Name == x => a21Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }
  /** *BEWARE*:  A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  A9,  A10,  A11,  A12,  A13,  A14,  A15,  A16,  A17,  A18,  A19,  A20,  A21,  A22 must be a concrete leaf type, and not an interface. */
  def flatUnionFormat22[U, A1 :JF: ClassTag, A2 :JF: ClassTag, A3 :JF: ClassTag, A4 :JF: ClassTag, A5 :JF: ClassTag, A6 :JF: ClassTag, A7 :JF: ClassTag, A8 :JF: ClassTag, A9 :JF: ClassTag, A10 :JF: ClassTag, A11 :JF: ClassTag, A12 :JF: ClassTag, A13 :JF: ClassTag, A14 :JF: ClassTag, A15 :JF: ClassTag, A16 :JF: ClassTag, A17 :JF: ClassTag, A18 :JF: ClassTag, A19 :JF: ClassTag, A20 :JF: ClassTag, A21 :JF: ClassTag, A22 :JF: ClassTag](typeFieldName: String): JF[U] = new JF[U] {
    lazy val a1Format = implicitly[JF[A1]]
    lazy val a2Format = implicitly[JF[A2]]
    lazy val a3Format = implicitly[JF[A3]]
    lazy val a4Format = implicitly[JF[A4]]
    lazy val a5Format = implicitly[JF[A5]]
    lazy val a6Format = implicitly[JF[A6]]
    lazy val a7Format = implicitly[JF[A7]]
    lazy val a8Format = implicitly[JF[A8]]
    lazy val a9Format = implicitly[JF[A9]]
    lazy val a10Format = implicitly[JF[A10]]
    lazy val a11Format = implicitly[JF[A11]]
    lazy val a12Format = implicitly[JF[A12]]
    lazy val a13Format = implicitly[JF[A13]]
    lazy val a14Format = implicitly[JF[A14]]
    lazy val a15Format = implicitly[JF[A15]]
    lazy val a16Format = implicitly[JF[A16]]
    lazy val a17Format = implicitly[JF[A17]]
    lazy val a18Format = implicitly[JF[A18]]
    lazy val a19Format = implicitly[JF[A19]]
    lazy val a20Format = implicitly[JF[A20]]
    lazy val a21Format = implicitly[JF[A21]]
    lazy val a22Format = implicitly[JF[A22]]

    lazy val a1Name = className(implicitly[ClassTag[A1]].runtimeClass)
    lazy val a2Name = className(implicitly[ClassTag[A2]].runtimeClass)
    lazy val a3Name = className(implicitly[ClassTag[A3]].runtimeClass)
    lazy val a4Name = className(implicitly[ClassTag[A4]].runtimeClass)
    lazy val a5Name = className(implicitly[ClassTag[A5]].runtimeClass)
    lazy val a6Name = className(implicitly[ClassTag[A6]].runtimeClass)
    lazy val a7Name = className(implicitly[ClassTag[A7]].runtimeClass)
    lazy val a8Name = className(implicitly[ClassTag[A8]].runtimeClass)
    lazy val a9Name = className(implicitly[ClassTag[A9]].runtimeClass)
    lazy val a10Name = className(implicitly[ClassTag[A10]].runtimeClass)
    lazy val a11Name = className(implicitly[ClassTag[A11]].runtimeClass)
    lazy val a12Name = className(implicitly[ClassTag[A12]].runtimeClass)
    lazy val a13Name = className(implicitly[ClassTag[A13]].runtimeClass)
    lazy val a14Name = className(implicitly[ClassTag[A14]].runtimeClass)
    lazy val a15Name = className(implicitly[ClassTag[A15]].runtimeClass)
    lazy val a16Name = className(implicitly[ClassTag[A16]].runtimeClass)
    lazy val a17Name = className(implicitly[ClassTag[A17]].runtimeClass)
    lazy val a18Name = className(implicitly[ClassTag[A18]].runtimeClass)
    lazy val a19Name = className(implicitly[ClassTag[A19]].runtimeClass)
    lazy val a20Name = className(implicitly[ClassTag[A20]].runtimeClass)
    lazy val a21Name = className(implicitly[ClassTag[A21]].runtimeClass)
    lazy val a22Name = className(implicitly[ClassTag[A22]].runtimeClass)

    def write[J](u: U, builder: Builder[J]): Unit = {
      builder.beginPreObject()
      builder.addFieldName(typeFieldName)
      builder.writeString(className(u.getClass))
      builder.endPreObject()
      u match {
        case x if implicitly[ClassTag[A1]].runtimeClass == x.getClass => a1Format.write(x.asInstanceOf[A1], builder)
        case x if implicitly[ClassTag[A2]].runtimeClass == x.getClass => a2Format.write(x.asInstanceOf[A2], builder)
        case x if implicitly[ClassTag[A3]].runtimeClass == x.getClass => a3Format.write(x.asInstanceOf[A3], builder)
        case x if implicitly[ClassTag[A4]].runtimeClass == x.getClass => a4Format.write(x.asInstanceOf[A4], builder)
        case x if implicitly[ClassTag[A5]].runtimeClass == x.getClass => a5Format.write(x.asInstanceOf[A5], builder)
        case x if implicitly[ClassTag[A6]].runtimeClass == x.getClass => a6Format.write(x.asInstanceOf[A6], builder)
        case x if implicitly[ClassTag[A7]].runtimeClass == x.getClass => a7Format.write(x.asInstanceOf[A7], builder)
        case x if implicitly[ClassTag[A8]].runtimeClass == x.getClass => a8Format.write(x.asInstanceOf[A8], builder)
        case x if implicitly[ClassTag[A9]].runtimeClass == x.getClass => a9Format.write(x.asInstanceOf[A9], builder)
        case x if implicitly[ClassTag[A10]].runtimeClass == x.getClass => a10Format.write(x.asInstanceOf[A10], builder)
        case x if implicitly[ClassTag[A11]].runtimeClass == x.getClass => a11Format.write(x.asInstanceOf[A11], builder)
        case x if implicitly[ClassTag[A12]].runtimeClass == x.getClass => a12Format.write(x.asInstanceOf[A12], builder)
        case x if implicitly[ClassTag[A13]].runtimeClass == x.getClass => a13Format.write(x.asInstanceOf[A13], builder)
        case x if implicitly[ClassTag[A14]].runtimeClass == x.getClass => a14Format.write(x.asInstanceOf[A14], builder)
        case x if implicitly[ClassTag[A15]].runtimeClass == x.getClass => a15Format.write(x.asInstanceOf[A15], builder)
        case x if implicitly[ClassTag[A16]].runtimeClass == x.getClass => a16Format.write(x.asInstanceOf[A16], builder)
        case x if implicitly[ClassTag[A17]].runtimeClass == x.getClass => a17Format.write(x.asInstanceOf[A17], builder)
        case x if implicitly[ClassTag[A18]].runtimeClass == x.getClass => a18Format.write(x.asInstanceOf[A18], builder)
        case x if implicitly[ClassTag[A19]].runtimeClass == x.getClass => a19Format.write(x.asInstanceOf[A19], builder)
        case x if implicitly[ClassTag[A20]].runtimeClass == x.getClass => a20Format.write(x.asInstanceOf[A20], builder)
        case x if implicitly[ClassTag[A21]].runtimeClass == x.getClass => a21Format.write(x.asInstanceOf[A21], builder)
        case x if implicitly[ClassTag[A22]].runtimeClass == x.getClass => a22Format.write(x.asInstanceOf[A22], builder)
      }
    }
    def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): U =
      jsOpt match {
        case Some(js) =>
          unbuilder.beginPreObject(js)
          val typeName = unbuilder.lookupField(typeFieldName) match {
            case Some(x) => unbuilder.readString(x)
            case None    => deserializationError("Field not found: $type")
          }
          unbuilder.endPreObject()
          val value = typeName match {
            case x if a1Name == x => a1Format.read(Some(js), unbuilder)
            case x if a2Name == x => a2Format.read(Some(js), unbuilder)
            case x if a3Name == x => a3Format.read(Some(js), unbuilder)
            case x if a4Name == x => a4Format.read(Some(js), unbuilder)
            case x if a5Name == x => a5Format.read(Some(js), unbuilder)
            case x if a6Name == x => a6Format.read(Some(js), unbuilder)
            case x if a7Name == x => a7Format.read(Some(js), unbuilder)
            case x if a8Name == x => a8Format.read(Some(js), unbuilder)
            case x if a9Name == x => a9Format.read(Some(js), unbuilder)
            case x if a10Name == x => a10Format.read(Some(js), unbuilder)
            case x if a11Name == x => a11Format.read(Some(js), unbuilder)
            case x if a12Name == x => a12Format.read(Some(js), unbuilder)
            case x if a13Name == x => a13Format.read(Some(js), unbuilder)
            case x if a14Name == x => a14Format.read(Some(js), unbuilder)
            case x if a15Name == x => a15Format.read(Some(js), unbuilder)
            case x if a16Name == x => a16Format.read(Some(js), unbuilder)
            case x if a17Name == x => a17Format.read(Some(js), unbuilder)
            case x if a18Name == x => a18Format.read(Some(js), unbuilder)
            case x if a19Name == x => a19Format.read(Some(js), unbuilder)
            case x if a20Name == x => a20Format.read(Some(js), unbuilder)
            case x if a21Name == x => a21Format.read(Some(js), unbuilder)
            case x if a22Name == x => a22Format.read(Some(js), unbuilder)
          }
          value match { case u: U @unchecked => u }
        case None => deserializationError("Expected union JsObject, but got None")
      }
  }

  private def className[A](c: Class[A]): String =
    try {
      c.getSimpleName
    } catch {
      case e: InternalError => c.getName
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy