diff options
Diffstat (limited to 'cask/src/cask/main/Routes.scala')
-rw-r--r-- | cask/src/cask/main/Routes.scala | 22 |
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 ) }""" |