From 53d04d4255489bd5802dc91d9dbebddd206d630b Mon Sep 17 00:00:00 2001 From: Stewart Stewart Date: Sat, 17 Dec 2016 02:11:18 -0500 Subject: add json format for date (ISO) --- src/main/scala/xyz/driver/core/date.scala | 7 ++++++- src/main/scala/xyz/driver/core/json.scala | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'src/main/scala/xyz') diff --git a/src/main/scala/xyz/driver/core/date.scala b/src/main/scala/xyz/driver/core/date.scala index b423585..0cf8986 100644 --- a/src/main/scala/xyz/driver/core/date.scala +++ b/src/main/scala/xyz/driver/core/date.scala @@ -23,7 +23,7 @@ object date { final case class Date(year: Int, month: Month, day: Int) { def iso8601: String = f"$year%04d-${month + 1}%02d-$day%02d" - def toJavaSqlDate = new java.sql.Date(toJavaDate.getTime) + def toJavaSqlDate = new java.sql.Date(toJavaDate.getTime) def toJavaDate: java.util.Date = { val cal = Calendar.getInstance() cal.set(Calendar.YEAR, year - 1900) @@ -34,6 +34,11 @@ object date { } object Date { + def parseIso(iso: String): Option[Date] = { + util.Try(iso.split("-").map(_.toInt)).toOption collect { + case Array(year, month, day) => Date(year, tagMonth(month), day) + } + } def fromJavaDate(date: java.util.Date) = { val cal = Calendar.getInstance() cal.setTime(date) diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index 277543b..ecd7cce 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -7,6 +7,7 @@ import akka.http.scaladsl.unmarshalling.Unmarshaller import spray.json.{DeserializationException, JsNumber, _} import xyz.driver.core.revision.Revision import xyz.driver.core.time.Time +import xyz.driver.core.date.Date import scala.reflect.runtime.universe._ @@ -66,6 +67,22 @@ object json { } } + implicit val dateFormat = new RootJsonFormat[Date] { + def write(date: Date) = JsObject("calendarDate" -> JsString(date.iso8601)) + + def read(value: JsValue): Date = value match { + case JsObject(fields) => + fields + .get("calendarDate") + .flatMap { + case JsString(iso) => Date.parseIso(iso) + case _ => None + } + .getOrElse(throw DeserializationException("Date expects YYYY-MM-DD")) + case _ => throw DeserializationException("Date expects YYYY-MM-DD") + } + } + def RevisionInPath[T]: PathMatcher1[Revision[T]] = PathMatcher("""[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}""".r) flatMap { string => Some(Revision[T](string)) -- cgit v1.2.3