aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/error/ErrorsResponse.scala
blob: 4d6aa0b1f8232444e6912b03f9f210ea9d31f2c9 (plain) (blame)
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package xyz.driver.pdsuicommon.error

import spray.json._
import ErrorsResponse.ResponseError

final case class ErrorsResponse(errors: Seq[ResponseError], requestId: String)

object ErrorsResponse {
  import DefaultJsonProtocol._

  /**
    * @param data      Any data that can be associated with particular error.Ex.: error field name
    * @param message   Error message
    * @param code      Unique error code
    *
    * @see https://driverinc.atlassian.net/wiki/display/RA/REST+API+Specification#RESTAPISpecification-HTTPStatuscodes
    */
  final case class ResponseError(data: Option[String], message: String, code: Int)

  object ResponseError {

    implicit val responseErrorJsonFormat: RootJsonFormat[ResponseError] = jsonFormat3(ResponseError.apply)

  }

  implicit val errorsResponseJsonFormat: RootJsonFormat[ErrorsResponse] = new RootJsonFormat[ErrorsResponse] {
    override def write(obj: ErrorsResponse): JsValue = {
      JsObject(
        "errors"    -> obj.errors.map(_.toJson).toJson,
        "requestId" -> obj.requestId.toJson
      )
    }

    override def read(json: JsValue): ErrorsResponse = json match {
      case JsObject(fields) =>
        val errors = fields
          .get("errors")
          .map(_.convertTo[Seq[ResponseError]])
          .getOrElse(deserializationError(s"ErrorsResponse json object does not contain `errors` field: $json"))

        val requestId = fields
          .get("requestId")
          .map(id => id.convertTo[String])
          .getOrElse(deserializationError(s"ErrorsResponse json object does not contain `requestId` field: $json"))

        ErrorsResponse(errors, requestId)

      case _ => deserializationError(s"Expected json as ErrorsResponse, but got $json")
    }
  }

}