From ab08e1a9d551fb1d647f0486cfdbc2427f5244a9 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Thu, 24 Nov 2016 15:48:47 +0000 Subject: [PATCH] Add back additional formats. At least a subset of these are required for sbt/sbt to migrate away from sbinary. This reverts commit cee43575ce3988b1565489db3166281cd7899cde. --- .../sbt/internal/util/AdditionalFormats.scala | 71 +++++++++++++++++++ .../sbt/internal/util/CacheImplicits.scala | 5 ++ 2 files changed, 76 insertions(+) create mode 100644 internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala new file mode 100644 index 000000000..8008cf90a --- /dev/null +++ b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala @@ -0,0 +1,71 @@ +package sbt.internal.util + +import sbt.internal.util.Types.:+: + +import sjsonnew.{ Builder, deserializationError, JsonFormat, Unbuilder } +import sjsonnew.BasicJsonProtocol, BasicJsonProtocol.asSingleton + +import java.io.{ ByteArrayInputStream, ByteArrayOutputStream, File, InputStream, OutputStream } + +import java.net.{ URI, URL } + +trait URIFormat { self: BasicJsonProtocol => + implicit def URIFormat: JsonFormat[URI] = project(_.toString, new URI(_: String)) +} + +trait URLFormat { self: BasicJsonProtocol => + implicit def URLFormat: JsonFormat[URL] = project(_.toString, new URL(_: String)) +} + +trait FileFormat { self: BasicJsonProtocol => + implicit def FileFormat: JsonFormat[File] = project(_.toString, new File(_: String)) +} + +trait SetFormat { self: BasicJsonProtocol => + implicit def SetFormat[T: JsonFormat]: JsonFormat[Set[T]] = project(_.toSeq, (_: Seq[T]).toSet) +} + +trait HListFormat { + implicit def HConsFormat[H: JsonFormat, T <: HList: JsonFormat]: JsonFormat[H :+: T] = + new JsonFormat[H :+: T] { + override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): H :+: T = + jsOpt match { + case Some(js) => + unbuilder.beginObject(js) + val h = unbuilder.readField[H]("h") + val t = unbuilder.readField[T]("t") + unbuilder.endObject() + + HCons(h, t) + + case None => + deserializationError("Expect JValue but found None") + } + + override def write[J](obj: H :+: T, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("h", obj.head) + builder.addField("t", obj.tail) + builder.endObject() + } + } + + implicit val HNilFormat: JsonFormat[HNil] = asSingleton(HNil) + +} + +trait StreamFormat { self: BasicJsonProtocol => + def streamFormat[T](write: (T, OutputStream) => Unit, read: InputStream => T): JsonFormat[T] = { + lazy val byteArrayFormat = implicitly[JsonFormat[Array[Byte]]] + val toBytes = (t: T) => { val bos = new ByteArrayOutputStream(); write(t, bos); bos.toByteArray } + val fromBytes = (bs: Array[Byte]) => read(new ByteArrayInputStream(bs)) + + new JsonFormat[T] { + override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): T = + fromBytes(byteArrayFormat.read(jsOpt, unbuilder)) + + override def write[J](obj: T, builder: Builder[J]): Unit = + byteArrayFormat.write(toBytes(obj), builder) + } + } +} diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala index 78e6e301c..0ebdf134b 100644 --- a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala +++ b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala @@ -4,3 +4,8 @@ import sjsonnew.BasicJsonProtocol object CacheImplicits extends BasicCacheImplicits with BasicJsonProtocol + with FileFormat + with HListFormat + with URIFormat + with URLFormat + with StreamFormat