Make JSON Parsing & Error Handling More Functional in Scala

77 views Asked by At

I have the following piece of code that I use to read the incoming JSON which looks like this:

{
"messageTypeId": 2,
 "messageId": "19223201",
 "BootNotification" :
 {
 "reason": "PowerUp",
  "chargingStation": {
    "serialNumber" : "12345",
    "model" : "",
    "vendorName" : "",
    "firmwareVersion" : "",
    "modem": {
      "iccid": "",
      "imsi": ""
    }
  }
 }
}

I have the following reads using play-json that would process this JSON:

implicit val ocppCallRequestReads: Reads[OCPPCallRequest] = Reads { jsValue =>
    val messageTypeId = (jsValue \ 0).toOption
    val messageId = (jsValue \ 1).toOption
    val actionName = (jsValue \ 2).toOption
    val payload = (jsValue \ 3).toOption
    (messageTypeId.zip(messageId.zip(actionName.zip(payload)))) match {
      case Some(_) => JsSuccess(
        OCPPCallRequest( // Here I know all 4 exists, so safe to call head
          messageTypeId.head.as[Int],
          messageId.head.as[String],
          actionName.head.as[String],
          payload.head
        )
      )
      case None => JsError( // Here, I know that I have to send a CallError back!
        "ERROR OCCURRED" // TODO: Work on this!
      )
    }
  }

It is not playing nicely when it comes to delivering the exact error message for the case None. It is all in or nothing, but what I want to avoid is that in my case None block, I would like to avoid looking into each of the Option and populate the corresponding error message. Any ideas on how I could make it more functional?

0

There are 0 answers