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

scala.pickling.internal.AutoDefaultRuntimePicklers.scala Maven / Gradle / Ivy

The newest version!
package scala.pickling
package internal

import scala.pickling.pickler.AnyUnpickler
import scala.pickling.runtime.{Tuple2RTKnownTagUnpickler, Tuple2RTPickler}
import scala.pickling.spi.PicklerRegistry

/** Helper method to help register picklers which can handle special/crazy classes for runtime generration.
  *
  *
  * Note: Currently this only handles Tuple2s
  */
trait RuntimePicklerRegistryHelper extends PicklerRegistry {
  final def autoRegisterDefaults(): Unit = {
    val tpes = List(
      "scala.Tuple2",
      "scala.Tuple2$mcII$sp",
      "scala.Tuple2$mcIJ$sp",
      "scala.Tuple2$mcID$sp",
      "scala.Tuple2$mcIZ$sp",

      "scala.Tuple2$mcJI$sp",
      "scala.Tuple2$mcJJ$sp",
      "scala.Tuple2$mcJD$sp",
      "scala.Tuple2$mcJC$sp",
      "scala.Tuple2$mcJZ$sp",

      "scala.Tuple2$mcDI$sp",
      "scala.Tuple2$mcDJ$sp",
      "scala.Tuple2$mcDD$sp",
      "scala.Tuple2$mcDC$sp",
      "scala.Tuple2$mcDZ$sp",

      "scala.Tuple2$mcCI$sp",
      "scala.Tuple2$mcCJ$sp",
      "scala.Tuple2$mcCD$sp",
      "scala.Tuple2$mcCC$sp",
      "scala.Tuple2$mcCZ$sp",

      "scala.Tuple2$mcZI$sp",
      "scala.Tuple2$mcZJ$sp",
      "scala.Tuple2$mcZD$sp",
      "scala.Tuple2$mcZC$sp",
      "scala.Tuple2$mcZZ$sp"
    )

    for(tpe <- tpes) {
      registerPicklerGenerator(tpe, tuplePicklerGenerator)
      registerUnpicklerGenerator(tpe, tupleUnpicklerGenerator)
    }
  }

  def tuplePicklerGenerator: AppliedType => Pickler[(Any,Any)] with Unpickler[(Any, Any)] = { tpe =>
    // TODO - Actually extract the tpe of the internal things.
    val tag = FastTypeTag.apply(internal.currentMirror, tpe.toString)
    new Tuple2RTPickler()
  }

  def tupleUnpicklerGenerator: AppliedType => Unpickler[(Any,Any)] = {
    case AppliedType(_, List(left, right)) =>
      val lhs =
        currentRuntime.picklers.lookupUnpickler(left.toString).getOrElse(AnyUnpickler).asInstanceOf[Unpickler[Any]]
      val rhs =
        currentRuntime.picklers.lookupUnpickler(right.toString).getOrElse(AnyUnpickler).asInstanceOf[Unpickler[Any]]
      new Tuple2RTKnownTagUnpickler(lhs, rhs)
    case tpe => new Tuple2RTPickler()
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy