summaryrefslogtreecommitdiff
path: root/cask/src
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 /cask/src
parent712bafb0c903a14dc0bf6b07e5529007635e004a (diff)
downloadcask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.tar.gz
cask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.tar.bz2
cask-f4e21bca86ec7c2b2ab96b9c0daa573a8b448efc.zip
WIP getting first decorator unit test working
Diffstat (limited to 'cask/src')
-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
3 files changed, 17 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
}