From 875cf6f4dc9fe510583b6a222be3b13e2a20f23f Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Mon, 20 Mar 2017 17:10:05 +0000 Subject: [PATCH] Simplify JValueFormat --- .../scala/sbt/internal/JValueFormat.scala | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/protocol/src/main/scala/sbt/internal/JValueFormat.scala b/protocol/src/main/scala/sbt/internal/JValueFormat.scala index e74d3bc73..d6f2a6dc9 100644 --- a/protocol/src/main/scala/sbt/internal/JValueFormat.scala +++ b/protocol/src/main/scala/sbt/internal/JValueFormat.scala @@ -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) } }