From 8a0c92de6c6481a055cfa482e875b31087a3ff41 Mon Sep 17 00:00:00 2001 From: vlad Date: Mon, 15 Aug 2016 13:41:38 -0700 Subject: Concurrency control types and implicits in companion objects --- src/main/scala/com/drivergrp/core/json.scala | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/main/scala/com/drivergrp/core/json.scala') 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 -- cgit v1.2.3