Simplify JValueFormat

This commit is contained in:
Dale Wijnand 2017-03-20 17:10:05 +00:00
parent 6211e8d7da
commit 875cf6f4dc
No known key found for this signature in database
GPG Key ID: 4F256E3D151DF5EF
1 changed files with 13 additions and 29 deletions

View File

@ -8,31 +8,15 @@ import sjsonnew.{ JsonWriter => JW, JsonReader => JR, JsonFormat => JF, _ }
import scala.json.ast.unsafe._
trait JValueFormat { self: sjsonnew.BasicJsonProtocol =>
/** Define a JsonWriter for the type T wrapper of underlying type U given JsonWriter[U] and T => U. */
def unlift[T, U](unlift: T => U)(implicit z: JW[U]): JW[T] = new JW[T] {
def write[J](w: T, b: Builder[J]) = z.write(unlift(w), b)
implicit val JNullJF: JF[JNull.type] = new JF[JNull.type] {
def write[J](x: JNull.type, b: Builder[J]) = b.writeNull()
def read[J](j: Option[J], u: Unbuilder[J]) = JNull
}
/** Define a JsonReader for the type T wrapper of underlying type U given JsonReader[U] and U => T. */
def lift[T, U](lift: U => T)(implicit z: JR[U]): JR[T] = new JR[T] {
def read[J](j: Option[J], u: Unbuilder[J]): T = lift(z.read(j, u))
}
@inline def ?[A](implicit z: A): A = z
implicit val JNullJW: JW[JNull.type] = new JW[JNull.type] { def write[J](x: JNull.type, b: Builder[J]) = b.writeNull() }
implicit val JNullJR: JR[JNull.type] = new JR[JNull.type] { def read[J](j: Option[J], u: Unbuilder[J]) = JNull }
implicit val JBooleanJW: JW[JBoolean] = unlift(_.get)
implicit val JBooleanJR: JR[JBoolean] = lift(JBoolean(_))
implicit val JStringJW: JW[JString] = unlift(_.value)
implicit val JStringJR: JR[JString] = lift(JString(_))
implicit val JNumberJW: JW[JNumber] = unlift(x => BigDecimal(x.value))
implicit val JNumberJR: JR[JNumber] = lift((x: BigDecimal) => JNumber(x.toString))
implicit lazy val JArrayJW: JW[JArray] = unlift[JArray, Array[JValue]](_.value)
implicit val JBooleanJF: JF[JBoolean] = project(_.get, JBoolean(_))
implicit val JStringJF: JF[JString] = project(_.value, JString(_))
implicit val JNumberJF: JF[JNumber] = project(x => BigDecimal(x.value), (x: BigDecimal) => JNumber(x.toString))
implicit val JArrayJF: JF[JArray] = project[JArray, Array[JValue]](_.value, JArray(_))
implicit lazy val JObjectJW: JW[JObject] = new JW[JObject] {
def write[J](x: JObject, b: Builder[J]) = {
@ -44,12 +28,12 @@ trait JValueFormat { self: sjsonnew.BasicJsonProtocol =>
implicit lazy val JValueJW: JW[JValue] = new JW[JValue] {
def write[J](x: JValue, b: Builder[J]) = x match {
case x: JNull.type => ?[JW[JNull.type]].write(x, b)
case x: JBoolean => ?[JW[JBoolean]].write(x, b)
case x: JString => ?[JW[JString]].write(x, b)
case x: JNumber => ?[JW[JNumber]].write(x, b)
case x: JObject => ?[JW[JObject]].write(x, b)
case x: JArray => ?[JW[JArray]].write(x, b)
case x: JNull.type => JNullJF.write(x, b)
case x: JBoolean => JBooleanJF.write(x, b)
case x: JString => JStringJF.write(x, b)
case x: JNumber => JNumberJF.write(x, b)
case x: JArray => JArrayJF.write(x, b)
case x: JObject => JObjectJW.write(x, b)
}
}