diff options
author | vlad <vlad@drivergrp.com> | 2016-08-15 13:41:38 -0700 |
---|---|---|
committer | vlad <vlad@drivergrp.com> | 2016-08-15 13:41:38 -0700 |
commit | 8a0c92de6c6481a055cfa482e875b31087a3ff41 (patch) | |
tree | f00f53c2620d742be7a3093428179e2d80df00d1 /src/main/scala/com/drivergrp/core/json.scala | |
parent | 14df717173bd1f78ab441499633d88e84b5ca46f (diff) | |
download | driver-core-8a0c92de6c6481a055cfa482e875b31087a3ff41.tar.gz driver-core-8a0c92de6c6481a055cfa482e875b31087a3ff41.tar.bz2 driver-core-8a0c92de6c6481a055cfa482e875b31087a3ff41.zip |
Concurrency control types and implicits in companion objects
Diffstat (limited to 'src/main/scala/com/drivergrp/core/json.scala')
-rw-r--r-- | src/main/scala/com/drivergrp/core/json.scala | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/main/scala/com/drivergrp/core/json.scala b/src/main/scala/com/drivergrp/core/json.scala index 6828a07..39a07ae 100644 --- a/src/main/scala/com/drivergrp/core/json.scala +++ b/src/main/scala/com/drivergrp/core/json.scala @@ -1,8 +1,12 @@ package com.drivergrp.core +import java.util.UUID + import akka.http.scaladsl.model.Uri.Path import akka.http.scaladsl.server.PathMatcher.Matched import akka.http.scaladsl.server.{PathMatcher, _} +import akka.http.scaladsl.unmarshalling.Unmarshaller +import com.drivergrp.core.revision.Revision import com.drivergrp.core.time.Time import spray.json.{DeserializationException, JsNumber, _} @@ -60,6 +64,26 @@ object json { } } + 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 => + try Some(Revision[T](UUID.fromString(string))) + catch { + case _: IllegalArgumentException => None + } + } + + implicit def revisionFromStringUnmarshaller[T]: Unmarshaller[String, Revision[T]] = + Unmarshaller.strict[String, Revision[T]] { string => Revision[T](UUID.fromString(string)) } + + implicit def revisionFormat[T] = new RootJsonFormat[Revision[T]] { + def write(revision: Revision[T]) = JsString(revision.id.toString) + + def read(value: JsValue): Revision[T] = value match { + case JsString(revision) => Revision[T](UUID.fromString(revision)) + case _ => throw new DeserializationException("Revision expects uuid string") + } + } + class EnumJsonFormat[T](mapping: (String, T)*) extends JsonFormat[T] { private val map = mapping.toMap |