diff --git a/server/app/com/xsn/explorer/models/Blockhash.scala b/server/app/com/xsn/explorer/models/Blockhash.scala new file mode 100644 index 0000000..eb08f81 --- /dev/null +++ b/server/app/com/xsn/explorer/models/Blockhash.scala @@ -0,0 +1,31 @@ +package com.xsn.explorer.models + +import play.api.libs.json._ + +class Blockhash private (val string: String) extends AnyVal + +object Blockhash { + private val pattern = "^[a-f0-9]{64}$".r.pattern + + def from(string: String): Option[Blockhash] = { + val lowercaseString = string.toLowerCase + + if (pattern.matcher(lowercaseString).matches()) { + Some(new Blockhash(lowercaseString)) + } else { + None + } + } + + implicit val reads: Reads[Blockhash] = Reads { json => + json.validate[String].flatMap { string => + from(string) + .map(JsSuccess.apply(_)) + .getOrElse { + JsError.apply("Invalid blockhash") + } + } + } + + implicit val writes: Writes[Blockhash] = Writes { obj => JsString(obj.string) } +}