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.scala43
1 files changed, 28 insertions, 15 deletions
diff --git a/cask/src/cask/main/Routes.scala b/cask/src/cask/main/Routes.scala
index c3d2bfc..76a84d0 100644
--- a/cask/src/cask/main/Routes.scala
+++ b/cask/src/cask/main/Routes.scala
@@ -1,8 +1,7 @@
package cask.main
-import cask.internal.Router
import cask.internal.Router.{ArgReader, EntryPoint}
-import cask.model.{BaseResponse, ParamContext}
+import cask.model.ParamContext
import scala.reflect.macros.blackbox.Context
import language.experimental.macros
@@ -17,30 +16,44 @@ object Routes{
def wrapMethodOutput(ctx: ParamContext,t: R): cask.internal.Router.Result[Any] = {
cask.internal.Router.Result.Success(t)
}
- def getParamValues(ctx: ParamContext): Map[String, InputType]
- def wrapPathSegment(s: String): InputType
+ def getRawParams(ctx: ParamContext): Map[String, Input]
+ def wrapPathSegment(s: String): Input
}
+
+ /**
+ * The core interface of decorator annotations: the decorator provides "raw"
+ * values to the annotated function via `getRawParams`, which then get
+ * processed by `getParamParser` into the correct argument types before
+ * being passed to the function.
+ *
+ * For a trivial "provide value" decorator, `getRawParams` would return the
+ * final param value and `getParamParser` would return a no-op parser. For
+ * a decorator that takes its input as query-params, JSON, or similar,
+ * `getRawParams` would provide raw query/JSON/etc. values and
+ * `getParamParser` would be responsible for processing those into the
+ * correct parameter types.
+ */
trait BaseDecorator{
- type InputType
- type InputParser[T]
- def getParamValues(ctx: ParamContext): Map[String, InputType]
- def parseMethodInput[T](implicit p: InputParser[T]) = p
+ type Input
+ type InputParser[T] <: ArgReader[Input, T, ParamContext]
+ def getRawParams(ctx: ParamContext): Map[String, Input]
+ def getParamParser[T](implicit p: InputParser[T]) = p
}
trait Decorator extends BaseDecorator {
- type InputType = Any
- type InputParser[T] = NoOpParser[InputType, T]
+ type Input = Any
+ type InputParser[T] = NoOpParser[Input, T]
}
- class NoOpParser[InputType, T] extends ArgReader[InputType, T, ParamContext] {
+ class NoOpParser[Input, T] extends ArgReader[Input, T, ParamContext] {
def arity = 1
- def read(ctx: ParamContext, label: String, input: InputType) = input.asInstanceOf[T]
+ def read(ctx: ParamContext, label: String, input: Input) = input.asInstanceOf[T]
}
object NoOpParser{
- implicit def instance[InputType, T] = new NoOpParser[InputType, T]
+ implicit def instance[Input, T] = new NoOpParser[Input, T]
}
case class EndpointMetadata[T](decorators: Seq[BaseDecorator],
@@ -80,8 +93,8 @@ object Routes{
weakTypeOf[T],
(t: router.c.universe.Tree) => q"${annotObjectSyms.head}.wrapMethodOutput(ctx, $t)",
c.weakTypeOf[ParamContext],
- annotObjectSyms.map(annotObjectSym => q"$annotObjectSym.parseMethodInput"),
- annotObjectSyms.map(annotObjectSym => tq"$annotObjectSym.InputType")
+ annotObjectSyms.map(annotObjectSym => q"$annotObjectSym.getParamParser"),
+ annotObjectSyms.map(annotObjectSym => tq"$annotObjectSym.Input")
)