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/rest.scala | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src/main/scala/com/drivergrp/core/rest.scala') 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