summaryrefslogtreecommitdiff
path: root/cask/src/cask/main
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-07-26 12:36:07 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-07-26 12:36:07 +0800
commitd8ae2662b44cc70d296832e3dc54685de4008a2d (patch)
tree61235be47c85a16707a53861bee97ee3651bb487 /cask/src/cask/main
parentdfaece8336adc803b9088621b45bdba1deb3213f (diff)
downloadcask-d8ae2662b44cc70d296832e3dc54685de4008a2d.tar.gz
cask-d8ae2662b44cc70d296832e3dc54685de4008a2d.tar.bz2
cask-d8ae2662b44cc70d296832e3dc54685de4008a2d.zip
Allow Decorators to short-circuit request processing by bailing out early
Diffstat (limited to 'cask/src/cask/main')
-rw-r--r--cask/src/cask/main/ErrorMsgs.scala6
-rw-r--r--cask/src/cask/main/Main.scala24
-rw-r--r--cask/src/cask/main/Routes.scala4
3 files changed, 20 insertions, 14 deletions
diff --git a/cask/src/cask/main/ErrorMsgs.scala b/cask/src/cask/main/ErrorMsgs.scala
index c5ce978..e54ea88 100644
--- a/cask/src/cask/main/ErrorMsgs.scala
+++ b/cask/src/cask/main/ErrorMsgs.scala
@@ -97,12 +97,10 @@ object ErrorMsgs {
val thingies = x.map{
case Router.Result.ParamError.Invalid(p, v, ex) =>
val literalV = literalize(v)
- val trace = new StringWriter()
- ex.printStackTrace(new PrintWriter(trace))
+ val trace = Util.stackTraceString(ex)
s"${p.name}: ${p.typeString} = $literalV failed to parse with $ex\n$trace"
case Router.Result.ParamError.DefaultFailed(p, ex) =>
- val trace = new StringWriter()
- ex.printStackTrace(new PrintWriter(trace))
+ val trace = Util.stackTraceString(ex)
s"${p.name}'s default value failed to evaluate with $ex\n$trace"
}
diff --git a/cask/src/cask/main/Main.scala b/cask/src/cask/main/Main.scala
index f28ae12..9ac0022 100644
--- a/cask/src/cask/main/Main.scala
+++ b/cask/src/cask/main/Main.scala
@@ -56,14 +56,22 @@ abstract class BaseMain{
routeTries(exchange.getRequestMethod.toString.toLowerCase()).lookup(Util.splitPath(exchange.getRequestPath).toList, Map()) match{
case None => writeResponse(exchange, handleError(404))
case Some(((routes, metadata), bindings, remaining)) =>
- val providers =
- Seq(metadata.endpoint.getRawParams(ParamContext(exchange, remaining)) ++
- bindings.mapValues(metadata.endpoint.wrapPathSegment)) ++
- metadata.decorators.map(e => e.getRawParams(ParamContext(exchange, remaining)))
-
- val result = metadata.entryPoint
- .asInstanceOf[EntryPoint[cask.main.Routes, cask.model.ParamContext]]
- .invoke(routes, ParamContext(exchange, remaining), providers)
+ val params = for{
+ endpointParams <- metadata.endpoint.getRawParams(ParamContext(exchange, remaining))
+ decoratorParams <- Util.sequenceEither(
+ metadata.decorators.map(e => e.getRawParams(ParamContext(exchange, remaining)))
+ )
+ } yield (endpointParams ++ bindings.mapValues(metadata.endpoint.wrapPathSegment)) +: decoratorParams
+
+ val result = params match{
+ case Left(resp) => resp
+ case Right(paramValues) =>
+ metadata.entryPoint
+ .asInstanceOf[EntryPoint[cask.main.Routes, cask.model.ParamContext]]
+ .invoke(routes, ParamContext(exchange, remaining), paramValues)
+ }
+
+
result match{
case Router.Result.Success(response: BaseResponse) => writeResponse(exchange, response)
case e: Router.Result.Error =>
diff --git a/cask/src/cask/main/Routes.scala b/cask/src/cask/main/Routes.scala
index 76a84d0..957a293 100644
--- a/cask/src/cask/main/Routes.scala
+++ b/cask/src/cask/main/Routes.scala
@@ -16,7 +16,7 @@ object Routes{
def wrapMethodOutput(ctx: ParamContext,t: R): cask.internal.Router.Result[Any] = {
cask.internal.Router.Result.Success(t)
}
- def getRawParams(ctx: ParamContext): Map[String, Input]
+
def wrapPathSegment(s: String): Input
}
@@ -37,7 +37,7 @@ object Routes{
trait BaseDecorator{
type Input
type InputParser[T] <: ArgReader[Input, T, ParamContext]
- def getRawParams(ctx: ParamContext): Map[String, Input]
+ def getRawParams(ctx: ParamContext): Either[cask.model.Response, Map[String, Input]]
def getParamParser[T](implicit p: InputParser[T]) = p
}