From ac14fc8de88d81475a4f2c4726c0a9f0924b063a Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Thu, 1 Dec 2016 14:38:40 +0000 Subject: [PATCH] Find a way to give FilesInfo an implicit JsonFormat --- .../main/scala/sbt/internal/util/FileInfo.scala | 16 ++++++++++++++++ .../util-cache/src/test/scala/FileInfoSpec.scala | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/FileInfo.scala b/internal/util-cache/src/main/scala/sbt/internal/util/FileInfo.scala index b86068cfd..5f4a3fd1e 100644 --- a/internal/util-cache/src/main/scala/sbt/internal/util/FileInfo.scala +++ b/internal/util-cache/src/main/scala/sbt/internal/util/FileInfo.scala @@ -16,6 +16,19 @@ sealed trait PlainFileInfo extends FileInfo { def exists: Boolean } sealed trait HashModifiedFileInfo extends HashFileInfo with ModifiedFileInfo +object HashFileInfo { + implicit val format: JsonFormat[HashFileInfo] = FileInfo.hash.format +} +object ModifiedFileInfo { + implicit val format: JsonFormat[ModifiedFileInfo] = FileInfo.lastModified.format +} +object PlainFileInfo { + implicit val format: JsonFormat[PlainFileInfo] = FileInfo.exists.format +} +object HashModifiedFileInfo { + implicit val format: JsonFormat[HashModifiedFileInfo] = FileInfo.full.format +} + private final case class PlainFile(file: File, exists: Boolean) extends PlainFileInfo private final case class FileModified(file: File, lastModified: Long) extends ModifiedFileInfo private final case class FileHash(file: File, hash: List[Byte]) extends HashFileInfo @@ -24,6 +37,9 @@ private final case class FileHashModified(file: File, hash: List[Byte], lastModi final case class FilesInfo[F <: FileInfo] private (files: Set[F]) object FilesInfo { def empty[F <: FileInfo]: FilesInfo[F] = FilesInfo(Set.empty[F]) + + implicit def format[F <: FileInfo: JsonFormat]: JsonFormat[FilesInfo[F]] = + project(_.files, (fs: Set[F]) => FilesInfo(fs)) } object FileInfo { diff --git a/internal/util-cache/src/test/scala/FileInfoSpec.scala b/internal/util-cache/src/test/scala/FileInfoSpec.scala index 55ad18666..ed7b4ec28 100644 --- a/internal/util-cache/src/test/scala/FileInfoSpec.scala +++ b/internal/util-cache/src/test/scala/FileInfoSpec.scala @@ -8,7 +8,7 @@ class FileInfoSpec extends UnitSpec { val fileInfo: ModifiedFileInfo = FileModified(file, file.lastModified()) val filesInfo = FilesInfo(Set(fileInfo)) - it should "round trip" in assertRoundTrip(filesInfo)(FileInfo.lastModified.formats, FileInfo.lastModified.formats) + it should "round trip" in assertRoundTrip(filesInfo) def assertRoundTrip[A: JsonWriter: JsonReader](x: A) = { val jsonString: String = toJsonString(x)