Skip to content

Instantly share code, notes, and snippets.

@dbousamra
Last active December 15, 2015 04:52
Show Gist options
  • Select an option

  • Save dbousamra/1c82b6b135a4b250d4ae to your computer and use it in GitHub Desktop.

Select an option

Save dbousamra/1c82b6b135a4b250d4ae to your computer and use it in GitHub Desktop.
package com.cammy.nvr.ws.messages
import argonaut._, Argonaut._
import com.cammy.nvr.domain.dtos.{CameraStatusDto, DeviceStatusDto}
import com.cammy.nvr.domain.manifest.VideoManifest
sealed trait DeviceResponsePayload
case class StatusResponseMessage(cameras: List[CameraStatusDto], device: DeviceStatusDto) extends DeviceResponsePayload
case class VideoChunksPresenceResponseMessage(videoChunks: List[String]) extends DeviceResponsePayload
case class VideoChunksUploadResponseMessage(manifest: VideoManifest) extends DeviceResponsePayload
object DeviceResponsePayload {
implicit lazy val CodecStatusResponseMessage: CodecJson[StatusResponseMessage] =
casecodec2(StatusResponseMessage.apply, StatusResponseMessage.unapply)("cameras", "device")
implicit lazy val CodecVideoChunksPresenceResponseMessage: CodecJson[VideoChunksPresenceResponseMessage] =
casecodec1(VideoChunksPresenceResponseMessage.apply, VideoChunksPresenceResponseMessage.unapply)("chunks")
implicit lazy val CodecVideoChunksUploadResponseMessage: CodecJson[VideoChunksUploadResponseMessage] =
casecodec1(VideoChunksUploadResponseMessage.apply, VideoChunksUploadResponseMessage.unapply)("manifest")
implicit lazy val CodecDeviceResponsePayload: CodecJson[DeviceResponsePayload] = CodecJson(
m => {
val payload = m match {
case m: StatusResponseMessage => m.asJson
case m: VideoChunksPresenceResponseMessage => m.asJson
case m: VideoChunksUploadResponseMessage => m.asJson
}
Json("payload" -> payload)
},
c => {
val payload = (c --\ "payload")
// this works.
payload.as[StatusResponseMessage].map(identity) ||| payload.as[VideoChunksPresenceResponseMessage].map(identity)
// this does not:
// payload.as[StatusResponseMessage].map(identity) ||| payload.as[VideoChunksPresenceResponseMessage].map(identity) ||| payload.as[VideoChunksUploadResponseMessage].map(identity)
}
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment