From 4e903b7bd19dd9daf7172ab06fe2e52b6b1fdb60 Mon Sep 17 00:00:00 2001 From: Sergey Nastich Date: Tue, 21 Aug 2018 18:17:13 -0400 Subject: Add json formats for country code and currency code (#197) --- src/main/scala/xyz/driver/core/json.scala | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/main/scala/xyz/driver') diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index 959239e..e4a0cef 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -8,6 +8,7 @@ import akka.http.scaladsl.model.Uri.Path import akka.http.scaladsl.server.PathMatcher.{Matched, Unmatched} import akka.http.scaladsl.server._ import akka.http.scaladsl.unmarshalling.Unmarshaller +import com.neovisionaries.i18n.{CountryCode, CurrencyCode} import enumeratum._ import eu.timepit.refined.api.{Refined, Validate} import eu.timepit.refined.collection.NonEmpty @@ -19,6 +20,7 @@ import xyz.driver.core.domain.{Email, PhoneNumber} import xyz.driver.core.rest.errors._ import xyz.driver.core.time.{Time, TimeOfDay} +import scala.reflect.{ClassTag, classTag} import scala.reflect.runtime.universe._ import scala.util.Try @@ -234,6 +236,10 @@ object json { JsString(obj.getHostAddress) } + implicit val countryCodeFormat: JsonFormat[CountryCode] = javaEnumFormat[CountryCode] + + implicit val currencyCodeFormat: JsonFormat[CurrencyCode] = javaEnumFormat[CurrencyCode] + object enumeratum { def enumUnmarshaller[T <: EnumEntry](enum: Enum[T]): Unmarshaller[String, T] = @@ -281,6 +287,11 @@ object json { } } + def javaEnumFormat[T <: java.lang.Enum[_]: ClassTag]: JsonFormat[T] = { + val values = classTag[T].runtimeClass.asInstanceOf[Class[T]].getEnumConstants + new EnumJsonFormat[T](values.map(v => v.name() -> v): _*) + } + class ValueClassFormat[T: TypeTag](writeValue: T => BigDecimal, create: BigDecimal => T) extends JsonFormat[T] { def write(valueClass: T) = JsNumber(writeValue(valueClass)) def read(json: JsValue): T = json match { -- cgit v1.2.3