From 79decc7012af5dea36f154c734b1caddc975924f Mon Sep 17 00:00:00 2001 From: vlad Date: Sat, 16 Jul 2016 20:46:19 -0400 Subject: Akka-http path extractors for Id and Name + Test double for app module --- src/main/scala/com/drivergrp/core/app.scala | 7 +++++++ src/main/scala/com/drivergrp/core/rest.scala | 14 +++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) (limited to 'src/main/scala/com/drivergrp/core') diff --git a/src/main/scala/com/drivergrp/core/app.scala b/src/main/scala/com/drivergrp/core/app.scala index 34a92e3..97e09b5 100644 --- a/src/main/scala/com/drivergrp/core/app.scala +++ b/src/main/scala/com/drivergrp/core/app.scala @@ -2,6 +2,7 @@ package com.drivergrp.core import akka.actor.ActorSystem import akka.http.scaladsl.Http +import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.RouteResult._ import akka.stream.ActorMaterializer @@ -91,6 +92,12 @@ object app { def deactivate(): Unit = {} } + class EmptyModule extends Module { + val name = "Nothing" + def route: Route = complete(StatusCodes.OK) + def routeTypes = Seq.empty[Type] + } + class SimpleModule(val name: String, val route: Route, routeType: Type) extends Module { def routeTypes: Seq[Type] = Seq(routeType) } diff --git a/src/main/scala/com/drivergrp/core/rest.scala b/src/main/scala/com/drivergrp/core/rest.scala index 71aed94..d8f6e4f 100644 --- a/src/main/scala/com/drivergrp/core/rest.scala +++ b/src/main/scala/com/drivergrp/core/rest.scala @@ -2,7 +2,9 @@ package com.drivergrp.core import akka.actor.ActorSystem import akka.http.scaladsl.Http +import akka.http.scaladsl.model.Uri.Path import akka.http.scaladsl.model.{HttpRequest, HttpResponse} +import akka.http.scaladsl.server.PathMatcher.Matched import akka.http.scaladsl.server.{Directive, _} import akka.http.scaladsl.util.FastFuture._ import akka.stream.ActorMaterializer @@ -68,7 +70,13 @@ object rest { object basicFormats { - implicit def idFormat[T] = new RootJsonFormat[Id[T]] { + def IdInPath[T]: PathMatcher1[Id[T]] = + PathMatcher("""[+-]?\d*""".r) flatMap { string ⇒ + try Some(Id[T](string.toLong)) + catch { case _: IllegalArgumentException ⇒ None } + } + + def IdFormat[T] = new RootJsonFormat[Id[T]] { def write(id: Id[T]) = JsNumber(id) def read(value: JsValue) = value match { @@ -77,6 +85,10 @@ object rest { } } + def NameInPath[T]: PathMatcher1[Name[T]] = new PathMatcher1[Name[T]] { + def apply(path: Path) = Matched(Path.Empty, Tuple1(Name[T](path.toString))) + } + implicit def nameFormat[T] = new RootJsonFormat[Name[T]] { def write(name: Name[T]) = JsString(name) -- cgit v1.2.3