diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 10:31:40 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 10:31:40 +0800 |
commit | 9326dfd92a9fc120c2cdd892575486193281fb26 (patch) | |
tree | e19373863d2d4c2b1845a07cfef10dabc88a434d /cask/src/cask/main | |
parent | 3654b08845673a5a83be46f4bdcf885d0fad3341 (diff) | |
download | cask-9326dfd92a9fc120c2cdd892575486193281fb26.tar.gz cask-9326dfd92a9fc120c2cdd892575486193281fb26.tar.bz2 cask-9326dfd92a9fc120c2cdd892575486193281fb26.zip |
Simplify public Decorator API
Diffstat (limited to 'cask/src/cask/main')
-rw-r--r-- | cask/src/cask/main/Main.scala | 7 | ||||
-rw-r--r-- | cask/src/cask/main/Routes.scala | 38 |
2 files changed, 31 insertions, 14 deletions
diff --git a/cask/src/cask/main/Main.scala b/cask/src/cask/main/Main.scala index 8e21e2e..763b12a 100644 --- a/cask/src/cask/main/Main.scala +++ b/cask/src/cask/main/Main.scala @@ -1,7 +1,5 @@ package cask.main -import java.io.{PrintWriter, StringWriter} - import cask.model._ import cask.internal.Router.EntryPoint import cask.internal.{DispatchTrie, Router, Util} @@ -9,7 +7,6 @@ import io.undertow.Undertow import io.undertow.server.{HttpHandler, HttpServerExchange} import io.undertow.server.handlers.BlockingHandler import io.undertow.util.HttpString -import fastparse.utils.Utils.literalize class MainRoutes extends BaseMain with Routes{ def allRoutes = Seq(this) @@ -60,9 +57,9 @@ abstract class BaseMain{ case None => writeResponse(exchange, handleError(404)) case Some(((routes, metadata), bindings, remaining)) => val providers = - Seq(metadata.endpoint.handle(ParamContext(exchange, remaining)) ++ + Seq(metadata.endpoint.getParamValues(ParamContext(exchange, remaining)) ++ bindings.mapValues(metadata.endpoint.wrapPathSegment)) ++ - metadata.decorators.map(e => e.handle(ParamContext(exchange, remaining))) + metadata.decorators.map(e => e.getParamValues(ParamContext(exchange, remaining))) val result = metadata.entryPoint .asInstanceOf[EntryPoint[cask.main.Routes, cask.model.ParamContext]] diff --git a/cask/src/cask/main/Routes.scala b/cask/src/cask/main/Routes.scala index 548162d..6f5b454 100644 --- a/cask/src/cask/main/Routes.scala +++ b/cask/src/cask/main/Routes.scala @@ -1,7 +1,7 @@ package cask.main import cask.internal.Router -import cask.internal.Router.EntryPoint +import cask.internal.Router.{ArgReader, EntryPoint} import cask.model.{BaseResponse, ParamContext} import scala.reflect.macros.blackbox.Context @@ -9,21 +9,41 @@ import language.experimental.macros object Routes{ - trait Endpoint[R] extends Decorator{ - type InputType + trait Endpoint[R] extends BaseDecorator{ + val path: String val methods: Seq[String] def subpath: Boolean = false - def wrapMethodOutput(ctx: ParamContext,t: R): cask.internal.Router.Result[Any] = cask.internal.Router.Result.Success(t) - def handle(ctx: ParamContext): Map[String, InputType] + 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 + } - trait Decorator{ + trait BaseDecorator{ type InputType - def handle(ctx: ParamContext): Map[String, InputType] + type InputParser[T] + def getParamValues(ctx: ParamContext): Map[String, InputType] + def parseMethodInput[T](implicit p: InputParser[T]) = p + + } + + trait Decorator extends BaseDecorator { + type InputType = Any + type InputParser[T] = NoOpParser[InputType, T] + } + + class NoOpParser[InputType, T] extends ArgReader[InputType, T, ParamContext] { + def arity = 1 + + def read(ctx: ParamContext, label: String, input: InputType) = input.asInstanceOf[T] + } + object NoOpParser{ + implicit def instance[InputType, T] = new NoOpParser[InputType, T] } - case class EndpointMetadata[T](decorators: Seq[Decorator], + case class EndpointMetadata[T](decorators: Seq[BaseDecorator], endpoint: Endpoint[_], entryPoint: EntryPoint[T, ParamContext]) case class RoutesEndpointsMetadata[T](value: EndpointMetadata[T]*) @@ -35,7 +55,7 @@ object Routes{ val routeParts = for{ m <- c.weakTypeOf[T].members - val annotations = m.annotations.filter(_.tree.tpe <:< c.weakTypeOf[Decorator]).reverse + val annotations = m.annotations.filter(_.tree.tpe <:< c.weakTypeOf[BaseDecorator]).reverse if annotations.nonEmpty } yield { val annotObjects = |