diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 12:36:07 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 12:36:07 +0800 |
commit | d8ae2662b44cc70d296832e3dc54685de4008a2d (patch) | |
tree | 61235be47c85a16707a53861bee97ee3651bb487 /cask/src/cask/main | |
parent | dfaece8336adc803b9088621b45bdba1deb3213f (diff) | |
download | cask-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.scala | 6 | ||||
-rw-r--r-- | cask/src/cask/main/Main.scala | 24 | ||||
-rw-r--r-- | cask/src/cask/main/Routes.scala | 4 |
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 } |