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/core.scala | 19 +++++++++++++---- src/main/scala/com/drivergrp/core/generators.scala | 6 ++++++ src/main/scala/com/drivergrp/core/json.scala | 24 ++++++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) (limited to 'src/main') diff --git a/src/main/scala/com/drivergrp/core/core.scala b/src/main/scala/com/drivergrp/core/core.scala index 8f38bc1..cfa96e7 100644 --- a/src/main/scala/com/drivergrp/core/core.scala +++ b/src/main/scala/com/drivergrp/core/core.scala @@ -1,5 +1,7 @@ package com.drivergrp +import java.util.UUID + import scalaz.Equal package object core { @@ -26,15 +28,24 @@ package object core { type Id[+Tag] = Long @@ Tag object Id { def apply[Tag](value: Long) = value.asInstanceOf[Id[Tag]] + + implicit def idEqual[T]: Equal[Id[T]] = Equal.equal[Id[T]](_ == _) + implicit def idOrdering[T]: Ordering[Id[T]] = Ordering.by(identity) } - implicit def idEqual[T]: Equal[Id[T]] = Equal.equal[Id[T]](_ == _) - implicit def idOrdering[T]: Ordering[Id[T]] = Ordering.by(identity) type Name[+Tag] = String @@ Tag object Name { def apply[Tag](value: String) = value.asInstanceOf[Name[Tag]] + + implicit def nameEqual[T]: Equal[Name[T]] = Equal.equal[Name[T]](_ == _) + implicit def nameOrdering[T]: Ordering[Name[T]] = Ordering.by(identity) } - implicit def nameEqual[T]: Equal[Name[T]] = Equal.equal[Name[T]](_ == _) - implicit def nameOrdering[T]: Ordering[Name[T]] = Ordering.by(identity) + object revision { + final case class Revision[T](id: UUID) + + object Revision { + implicit def revisionEqual[T]: Equal[Revision[T]] = Equal.equal[Revision[T]](_.id == _.id) + } + } } diff --git a/src/main/scala/com/drivergrp/core/generators.scala b/src/main/scala/com/drivergrp/core/generators.scala index 4421b5a..22a838c 100644 --- a/src/main/scala/com/drivergrp/core/generators.scala +++ b/src/main/scala/com/drivergrp/core/generators.scala @@ -1,6 +1,8 @@ package com.drivergrp.core import java.math.MathContext + +import com.drivergrp.core.revision.Revision import com.drivergrp.core.time.{Time, TimeRange} import scala.reflect.ClassTag @@ -18,6 +20,10 @@ object generators { def nextName[T](maxLength: Int = DefaultMaxLength): Name[T] = Name[T](nextString(maxLength)) + def nextUuid() = java.util.UUID.randomUUID + + def nextRevision[T]() = Revision[T](nextUuid()) + def nextString(maxLength: Int = DefaultMaxLength): String = (oneOf[Char](StringLetters) +: arrayOf(oneOf[Char](StringLetters), maxLength - 1)).mkString 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