summaryrefslogtreecommitdiff
path: root/cask/src/cask/main/Routes.scala
diff options
context:
space:
mode:
Diffstat (limited to 'cask/src/cask/main/Routes.scala')
-rw-r--r--cask/src/cask/main/Routes.scala22
1 files changed, 12 insertions, 10 deletions
diff --git a/cask/src/cask/main/Routes.scala b/cask/src/cask/main/Routes.scala
index f133fdb..a6bdd65 100644
--- a/cask/src/cask/main/Routes.scala
+++ b/cask/src/cask/main/Routes.scala
@@ -1,7 +1,6 @@
package cask.main
import cask.internal.Router.EntryPoint
-import cask.model.Request
import scala.reflect.macros.blackbox.Context
import language.experimental.macros
@@ -19,33 +18,36 @@ object Routes{
val routeParts = for{
m <- c.weakTypeOf[T].members
- val annotations = m.annotations.filter(_.tree.tpe <:< c.weakTypeOf[Decorator[_, _]]).reverse
+ annotations = m.annotations.filter(_.tree.tpe <:< c.weakTypeOf[Decorator[_, _]])
if annotations.nonEmpty
} yield {
- if(!(annotations.head.tree.tpe <:< weakTypeOf[Endpoint[_, _]])) c.abort(
+ if(!(annotations.last.tree.tpe <:< weakTypeOf[Endpoint[_, _]])) c.abort(
annotations.head.tree.pos,
s"Last annotation applied to a function must be an instance of Endpoint, " +
- s"not ${annotations.head.tree.tpe}"
+ s"not ${annotations.last.tree.tpe}"
)
val allEndpoints = annotations.filter(_.tree.tpe <:< weakTypeOf[Endpoint[_, _]])
if(allEndpoints.length > 1) c.abort(
- annotations.head.tree.pos,
+ annotations.last.tree.pos,
s"You can only apply one Endpoint annotation to a function, not " +
s"${allEndpoints.length} in ${allEndpoints.map(_.tree.tpe).mkString(", ")}"
)
+
val annotObjects =
for(annot <- annotations)
yield q"new ${annot.tree.tpe}(..${annot.tree.children.tail})"
+
val annotObjectSyms =
for(_ <- annotations.indices)
yield c.universe.TermName(c.freshName("annotObject"))
+
val route = router.extractMethod(
m.asInstanceOf[MethodSymbol],
weakTypeOf[T],
- q"${annotObjectSyms.head}.convertToResultType",
+ q"${annotObjectSyms.last}.convertToResultType",
tq"cask.Request",
- annotObjectSyms.map(annotObjectSym => q"$annotObjectSym.getParamParser"),
- annotObjectSyms.map(annotObjectSym => tq"$annotObjectSym.InputTypeAlias")
+ annotObjectSyms.reverse.map(annotObjectSym => q"$annotObjectSym.getParamParser"),
+ annotObjectSyms.reverse.map(annotObjectSym => tq"$annotObjectSym.InputTypeAlias")
)
val declarations =
@@ -55,8 +57,8 @@ object Routes{
val res = q"""{
..$declarations
cask.main.Routes.EndpointMetadata(
- Seq(..${annotObjectSyms.drop(1)}),
- ${annotObjectSyms.head},
+ Seq(..${annotObjectSyms.dropRight(1)}),
+ ${annotObjectSyms.last},
$route
)
}"""