Find a way to give FilesInfo an implicit JsonFormat

This commit is contained in:
Dale Wijnand 2016-12-01 14:38:40 +00:00
parent 6527382a4e
commit ac14fc8de8
No known key found for this signature in database
GPG Key ID: 4F256E3D151DF5EF
2 changed files with 17 additions and 1 deletions

View File

@ -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 {

View File

@ -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)