summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-07-26 00:00:33 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-07-26 00:00:33 +0800
commitf4e21bca86ec7c2b2ab96b9c0daa573a8b448efc (patch)
treea4bd0b30c6ae2a8daadc149a3c11a3f153cf01c7
parent712bafb0c903a14dc0bf6b07e5529007635e004a (diff)
downloadcask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.tar.gz
cask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.tar.bz2
cask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.zip
WIP getting first decorator unit test working
-rw-r--r--cask/src/cask/internal/Router.scala2
-rw-r--r--cask/src/cask/main/Main.scala11
-rw-r--r--cask/src/cask/main/Routes.scala15
-rw-r--r--cask/test/src/test/cask/Decorator.scala26
-rw-r--r--cask/test/src/test/cask/ExampleTests.scala3
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()
}
}