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

com.github.andyglow.json.ToValue.scala Maven / Gradle / Ivy

package com.github.andyglow.json

trait ToValue[T] {

  def apply(x: T): Value
}

trait LowPriorityPrimitiveImplicits {
  import Value._
  import ToValue._

  implicit val BoolV: ToValue[Boolean]          = mk(bool.apply)
  implicit val IntV: ToValue[Int]               = mk(num.apply)
  implicit val LongV: ToValue[Long]             = mk(num.apply)
  implicit val ShortV: ToValue[Short]           = mk(num.apply)
  implicit val FloatV: ToValue[Float]           = mk(num.apply)
  implicit val DoubleV: ToValue[Double]         = mk(num.apply)
  implicit val BigDecimalV: ToValue[BigDecimal] = mk(num.apply)
  implicit val BigIntV: ToValue[BigInt]         = mk(num.apply)
  implicit val NumberV: ToValue[Number]         = mk(num.apply)
  implicit val StringV: ToValue[String]         = mk(str.apply)
  implicit val NullV: ToValue[Null]             = mk(_ => `null`)

  // NOTICE: there are no way to work around objects (case classes) as long as different libraries
  // may generate different json representations out of the single case class instance
}

trait LowPriorityMapImplicits { this: LowPriorityPrimitiveImplicits =>
  import Value._
  import ToValue._

  implicit def StrMapV[T](implicit to: ToValue[T]): ToValue[Map[String, T]] = {

    mk { items =>
      val v = items map { case (k, v) => (k, to(v)) }
      obj(v.toMap)
    }
  }

  implicit def IntMapV[T](implicit to: ToValue[T]): ToValue[Map[Int, T]] = {

    mk { items =>
      val v = items map { case (k, v) => (k.toString, to(v)) }
      obj(v.toMap)
    }
  }
}

trait LowPriorityProductImplicits {
  import Value._
  import ToValue._

  implicit def ProductV[T <: Product]: ToValue[T] = mk(p => str(p.productPrefix))
}
trait LowPriorityImplicits extends LowPriorityPrimitiveImplicits with LowPriorityArrayImplicits with LowPriorityMapImplicits

object ToValue extends LowPriorityImplicits {

  def mk[T](f: T => Value): ToValue[T] = new ToValue[T] { def apply(x: T): Value = f(x) }

  def apply[T](x: T)(implicit to: ToValue[T]): Value = to(x)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy