sealed abstract class BloodType(val code: Int)
object BloodType {
case object A extends BloodType(0)
case object B extends BloodType(1)
case object AB extends BloodType(2)
case object O extends BloodType(3)
val map: Map[Int, BloodType] = getClass.getClasses
.map(_.getField("MODULE$").get(null).asInstanceOf[BloodType])
.map(x => x.code -> x).toMap
}
import play.api.libs.json._
implicit val format = new Format[BloodType] {
override def writes(o: BloodType): JsValue = JsNumber(o.code)
override def reads(json: JsValue): JsResult[BloodType] = json.asOpt[Int]
.flatMap(code => BloodType.map.get(code))
.fold(JsError("error"))(v => JsSuccess(v))
}