aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain/formats/json/slotarm.scala
blob: 60d6521157b7d34fdf381ab381c91a0e8f38da4a (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
package xyz.driver.pdsuidomain.formats.json

import spray.json._
import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuidomain.entities.{SlotArm, Trial}

object slotarm {
  import DefaultJsonProtocol._
  import common._

  def applyUpdateToArm(json: JsValue, orig: SlotArm): SlotArm = json match {
    case JsObject(fields) =>
      val name = fields
        .get("name")
        .map(_.convertTo[String])
        .getOrElse(deserializationError(s"Arm json object does not contain `name` field: $json"))
      orig.copy(name = name)

    case _ => deserializationError(s"Expected Json Object as partial Arm, but got $json")
  }

  implicit def slotArmFormat: RootJsonFormat[SlotArm] = new RootJsonFormat[SlotArm] {
    override def write(obj: SlotArm): JsValue =
      JsObject(
        "id"           -> obj.id.toJson,
        "name"         -> obj.name.toJson,
        "originalName" -> obj.originalName.toJson,
        "trialId"      -> obj.trialId.toJson
      )

    override def read(json: JsValue): SlotArm = json.asJsObject.getFields("trialId", "name") match {
      case Seq(trialId, name) =>
        SlotArm(
          id = json.asJsObject.fields.get("id").flatMap(_.convertTo[Option[LongId[SlotArm]]]).getOrElse(LongId(0)),
          name = name.convertTo[String],
          trialId = trialId.convertTo[StringId[Trial]],
          originalName = name.convertTo[String]
        )

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

}