/
AkkaHttpJsonapiSupport.scala
28 lines (24 loc) · 1.26 KB
/
AkkaHttpJsonapiSupport.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package org.zalando.jsonapi.json.akka.http
import akka.http.scaladsl.marshalling._
import akka.http.scaladsl.model.HttpEntity
import akka.http.scaladsl.model.MediaTypes._
import akka.http.scaladsl.unmarshalling._
import org.zalando.jsonapi.json.sprayjson.SprayJsonJsonapiProtocol
import org.zalando.jsonapi.model._
import org.zalando.jsonapi._
import org.zalando.jsonapi.{JsonapiRootObjectReader, JsonapiRootObjectWriter}
import spray.json._
trait AkkaHttpJsonapiSupport extends SprayJsonJsonapiProtocol with DefaultJsonProtocol {
def akkaHttpJsonapiMarshaller[T: JsonapiRootObjectWriter]: ToEntityMarshaller[T] =
Marshaller.StringMarshaller.wrap(`application/vnd.api+json`)(_.rootObject.toJson.compactPrint)
def akkaHttpJsonapiUnmarshaller[T: JsonapiRootObjectReader]: FromEntityUnmarshaller[T] =
Unmarshaller.stringUnmarshaller
.forContentTypes(`application/vnd.api+json`)
.map(_.parseJson.convertTo[RootObject].jsonapi[T])
}
object AkkaHttpJsonapiSupport extends AkkaHttpJsonapiSupport {
implicit def akkaHttpJsonapiMarshallerImplicit[T: JsonapiRootObjectWriter]: ToEntityMarshaller[T] =
akkaHttpJsonapiMarshaller
implicit def akkaHttpJsonapiUnmarshallerImplicit[T: JsonapiRootObjectReader]: FromEntityUnmarshaller[T] =
akkaHttpJsonapiUnmarshaller
}