aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandr <ognelisar@gmail.com>2017-10-12 10:59:02 +0700
committerAleksandr <ognelisar@gmail.com>2017-10-12 10:59:02 +0700
commit18b5979ae51ead407e7ebda12d6346031c0dde9d (patch)
tree86835f6b1ef7a4f9e8f3ad2a528a873977d18a2d
parentf525ab2604cc5d1366c852bdbcb4d912bbcea800 (diff)
downloadrest-query-18b5979ae51ead407e7ebda12d6346031c0dde9d.tar.gz
rest-query-18b5979ae51ead407e7ebda12d6346031c0dde9d.tar.bz2
rest-query-18b5979ae51ead407e7ebda12d6346031c0dde9d.zip
Improved ListResponse class
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala32
1 files changed, 15 insertions, 17 deletions
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala
index 59a1a48..34cb7f1 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala
@@ -2,15 +2,17 @@ package xyz.driver.pdsuidomain.formats.json.sprayformats
import java.time.LocalDateTime
-import spray.json.{RootJsonFormat, _}
+import spray.json._
+import spray.json.DefaultJsonProtocol._
import xyz.driver.pdsuicommon.db.Pagination
import xyz.driver.pdsuidomain.formats.json.sprayformats.common._
+
final case class ListResponse[+T](items: Seq[T], meta: ListResponse.Meta)
-object ListResponse extends DefaultJsonProtocol {
+object ListResponse {
private val itemsField = "items"
- private val metaField = "meta"
+ private val metaField = "meta"
final case class Meta(itemsCount: Int, pageNumber: Int, pageSize: Int, lastUpdate: Option[LocalDateTime])
@@ -27,31 +29,27 @@ object ListResponse extends DefaultJsonProtocol {
implicit val listResponseMetaFormat: RootJsonFormat[Meta] = jsonFormat4(Meta.apply)
- private def listResponseJsonWriter[T: JsonWriter](listResponse: ListResponse[T]) = {
- JsObject(
- itemsField -> listResponse.items.map(_.toJson).toJson,
- metaField -> listResponse.meta.toJson
- )
- }
-
implicit def listResponseWriter[T: JsonWriter]: RootJsonWriter[ListResponse[T]] =
new RootJsonWriter[ListResponse[T]] {
override def write(listResponse: ListResponse[T]): JsValue = {
- listResponseJsonWriter(listResponse)
+ JsObject(
+ itemsField -> listResponse.items.map(_.toJson).toJson,
+ metaField -> listResponse.meta.toJson
+ )
}
}
- implicit def listResponseFormat[T: RootJsonFormat]: RootJsonFormat[ListResponse[T]] =
- new RootJsonFormat[ListResponse[T]] {
- override def write(listResponse: ListResponse[T]): JsValue = {
- listResponseJsonWriter(listResponse)
- }
+ implicit def listResponseReader[T: JsonReader]: RootJsonReader[ListResponse[T]] =
+ new RootJsonReader[ListResponse[T]] {
override def read(json: JsValue): ListResponse[T] = json match {
case JsObject(fields) =>
val items = fields
.get(itemsField)
- .map(_.convertTo[Seq[T]])
+ .map{
+ case JsArray(elements) => elements.map(_.convertTo[T])(collection.breakOut)
+ case x => deserializationError(s"Expected Array as JsArray, but got $x")
+ }
.getOrElse(deserializationError(s"ListResponse json object does not contain `$itemsField` field: $json"))
val meta = fields