aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/listresponse.scala
diff options
context:
space:
mode:
authorAleksandr <ognelisar@gmail.com>2017-10-23 14:49:40 +0700
committerAleksandr <ognelisar@gmail.com>2017-10-23 14:49:40 +0700
commit7f8b3b9621ad31328dd135a67152f97e0419d5c9 (patch)
tree9deecc62f7cf2518effe4ed7568ee5fdc8e3b3f7 /src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/listresponse.scala
parent133b4fe8487db9df80c1f39f64bbe7d6fc039952 (diff)
parentd1537fa8bbf7c7097fe7ddb410e40c82381d79f2 (diff)
downloadrest-query-7f8b3b9621ad31328dd135a67152f97e0419d5c9.tar.gz
rest-query-7f8b3b9621ad31328dd135a67152f97e0419d5c9.tar.bz2
rest-query-7f8b3b9621ad31328dd135a67152f97e0419d5c9.zip
Merge branch 'master' into PDSUI-2330
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/listresponse.scala')
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/listresponse.scala45
1 files changed, 45 insertions, 0 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
new file mode 100644
index 0000000..20644dc
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/listresponse.scala
@@ -0,0 +1,45 @@
+package xyz.driver.pdsuidomain.formats.json.sprayformats
+
+import spray.json._
+import spray.json.DefaultJsonProtocol._
+import xyz.driver.pdsuidomain.ListResponse
+import xyz.driver.pdsuidomain.formats.json.sprayformats.common._
+
+object listresponse {
+ private val itemsField = "items"
+ private val metaField = "meta"
+
+ implicit val listResponseMetaFormat: RootJsonFormat[ListResponse.Meta] = jsonFormat4(ListResponse.Meta.apply)
+
+ implicit def listResponseWriter[T: JsonWriter]: RootJsonWriter[ListResponse[T]] =
+ new RootJsonWriter[ListResponse[T]] {
+ override def write(listResponse: ListResponse[T]): JsValue = {
+ JsObject(
+ itemsField -> listResponse.items.map(_.toJson).toJson,
+ metaField -> listResponse.meta.toJson
+ )
+ }
+ }
+
+ 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 {
+ 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
+ .get(metaField)
+ .map(_.convertTo[ListResponse.Meta])
+ .getOrElse(deserializationError(s"ListResponse json object does not contain `$metaField` field: $json"))
+
+ ListResponse(items, meta)
+ case _ => deserializationError(s"Expected ListResponse json object, but got $json")
+ }
+ }
+}