package models sealed abstract class Measure { def productPrefix: String def name: String = this.productPrefix.split("\\.").last // def primaryUnit: Uni } object Measure { import play.api.libs.json._ implicit val measureFormat = new Format[Measure] { def writes(m: Measure): JsValue = Json.toJson(m.name.toLowerCase) def reads(jsValue: JsValue): JsResult[Measure] = jsValue.validate[String] match { case s: JsSuccess[String] => s.get match { case "mass" => JsSuccess(Mass()) case "volume" => JsSuccess(Volume()) case "number" => JsSuccess(Number()) } case e: JsError => e } } } case class Mass() extends Measure // { // val primaryUnit = Gram // } case class Volume() extends Measure // { // val primaryUnit = Liter // } case class Number() extends Measure // { // val primaryUnit = Count // }