diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 00:00:33 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 00:00:33 +0800 |
commit | f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc (patch) | |
tree | a4bd0b30c6ae2a8daadc149a3c11a3f153cf01c7 /cask | |
parent | 712bafb0c903a14dc0bf6b07e5529007635e004a (diff) | |
download | cask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.tar.gz cask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.tar.bz2 cask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.zip |
WIP getting first decorator unit test working
Diffstat (limited to 'cask')
-rw-r--r-- | cask/src/cask/internal/Router.scala | 2 | ||||
-rw-r--r-- | cask/src/cask/main/Main.scala | 11 | ||||
-rw-r--r-- | cask/src/cask/main/Routes.scala | 15 | ||||
-rw-r--r-- | cask/test/src/test/cask/Decorator.scala | 26 | ||||
-rw-r--r-- | cask/test/src/test/cask/ExampleTests.scala | 3 |
5 files changed, 46 insertions, 11 deletions
diff --git a/cask/src/cask/internal/Router.scala b/cask/src/cask/internal/Router.scala index 826b1f6..50d0ea4 100644 --- a/cask/src/cask/internal/Router.scala +++ b/cask/src/cask/internal/Router.scala @@ -308,7 +308,7 @@ class Router[C <: Context](val c: C) { val argNames = argData.map(_._3) val readArgs = argData.map(_._4) var methodCall: c.Tree = q"$baseArgSym.${meth.name.toTermName}" - for(argNameCast <- argNameCasts) methodCall = q"$baseArgSym.${meth.name.toTermName}(..$argNameCast)" + for(argNameCast <- argNameCasts) methodCall = q"$methodCall(..$argNameCast)" val res = q""" cask.internal.Router.EntryPoint[$curCls, $ctx]( diff --git a/cask/src/cask/main/Main.scala b/cask/src/cask/main/Main.scala index bfb058e..0523fb1 100644 --- a/cask/src/cask/main/Main.scala +++ b/cask/src/cask/main/Main.scala @@ -31,8 +31,8 @@ abstract class BaseMain{ lazy val routeTries = Seq("get", "put", "post") .map { method => method -> DispatchTrie.construct[(Routes, Routes.EndpointMetadata[_])](0, - for ((route, metadata) <- routeList if metadata.endpoints.exists(_.methods.contains(method))) - yield (Util.splitPath(metadata.endpoints.last.path): IndexedSeq[String], (route, metadata), metadata.endpoints.last.subpath) + for ((route, metadata) <- routeList if metadata.endpoint.methods.contains(method)) + yield (Util.splitPath(metadata.endpoint.path): IndexedSeq[String], (route, metadata), metadata.endpoint.subpath) ) }.toMap @@ -59,9 +59,10 @@ abstract class BaseMain{ routeTries(exchange.getRequestMethod.toString.toLowerCase()).lookup(Util.splitPath(exchange.getRequestPath).toList, Map()) match{ case None => writeResponse(exchange, handleError(404)) case Some(((routes, metadata), bindings, remaining)) => - val providers = metadata.endpoints.map(e => - e.handle(ParamContext(exchange, remaining)) ++ bindings.mapValues(e.wrapPathSegment) - ) + val providers = + Seq(metadata.endpoint.handle(ParamContext(exchange, remaining)) ++ + bindings.mapValues(metadata.endpoint.wrapPathSegment)) ++ + metadata.decorators.map(e => e.handle(ParamContext(exchange, remaining))) val result = metadata.entryPoint .asInstanceOf[EntryPoint[cask.main.Routes, cask.model.ParamContext]] .invoke(routes, ParamContext(exchange, remaining), providers) diff --git a/cask/src/cask/main/Routes.scala b/cask/src/cask/main/Routes.scala index 7299276..b8dcbc1 100644 --- a/cask/src/cask/main/Routes.scala +++ b/cask/src/cask/main/Routes.scala @@ -9,7 +9,7 @@ import language.experimental.macros object Routes{ - trait Endpoint[R]{ + trait Endpoint[R] extends Decorator{ type InputType val path: String val methods: Seq[String] @@ -18,8 +18,13 @@ object Routes{ def handle(ctx: ParamContext): Map[String, InputType] def wrapPathSegment(s: String): InputType } + trait Decorator{ + type InputType + def handle(ctx: ParamContext): Map[String, InputType] + } - case class EndpointMetadata[T](endpoints: Seq[Endpoint[_]], + case class EndpointMetadata[T](decorators: Seq[Decorator], + endpoint: Endpoint[_], entryPoint: EntryPoint[T, ParamContext]) case class RoutesEndpointsMetadata[T](value: EndpointMetadata[T]*) object RoutesEndpointsMetadata{ @@ -30,7 +35,7 @@ object Routes{ val routeParts = for{ m <- c.weakTypeOf[T].members - val annotations = m.annotations.filter(_.tree.tpe <:< c.weakTypeOf[Endpoint[_]]) + val annotations = m.annotations.filter(_.tree.tpe <:< c.weakTypeOf[Decorator]) if annotations.nonEmpty } yield { @@ -57,11 +62,11 @@ object Routes{ val res = q"""{ ..$declarations cask.main.Routes.EndpointMetadata( - Seq(..$annotObjectSyms), + Seq(..${annotObjectSyms.dropRight(1)}), + ${annotObjectSyms.last}, $route ) }""" -// println(res) res } diff --git a/cask/test/src/test/cask/Decorator.scala b/cask/test/src/test/cask/Decorator.scala new file mode 100644 index 0000000..0e31019 --- /dev/null +++ b/cask/test/src/test/cask/Decorator.scala @@ -0,0 +1,26 @@ +package test.cask +import cask.internal.Router.ArgReader +import cask.model.ParamContext + + +object Decorator extends cask.MainRoutes{ + class myDecorator extends cask.main.Routes.Decorator { + type InputType = Int + + def handle(ctx: ParamContext) = Map("extra" -> 31337) + + def parseMethodInput[T] = new ArgReader[Int, T, ParamContext] { + def arity = 0 + + def read(ctx: ParamContext, label: String, input: Int) = 0.asInstanceOf[T] + } + } + + @myDecorator() + @cask.get("/hello/:world") + def hello(world: String)(extra: Int) = { + world + extra + } + + initialize() +} diff --git a/cask/test/src/test/cask/ExampleTests.scala b/cask/test/src/test/cask/ExampleTests.scala index b60f30c..8787b3a 100644 --- a/cask/test/src/test/cask/ExampleTests.scala +++ b/cask/test/src/test/cask/ExampleTests.scala @@ -85,6 +85,9 @@ object ExampleTests extends TestSuite{ data = Seq("value1" -> "hello", "value2" -> "1", "value2" -> "2") ).text() ==> "OK Plain(hello,null) List(1, 2)" + } + 'Decorator - test(Decorator){ host => + requests.get(host + "/hello/woo").text() } } |