summaryrefslogtreecommitdiff
path: root/cask/src/cask/main
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-07-26 10:31:40 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-07-26 10:31:40 +0800
commit9326dfd92a9fc120c2cdd892575486193281fb26 (patch)
treee19373863d2d4c2b1845a07cfef10dabc88a434d /cask/src/cask/main
parent3654b08845673a5a83be46f4bdcf885d0fad3341 (diff)
downloadcask-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.scala7
-rw-r--r--cask/src/cask/main/Routes.scala38
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 =