diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-28 20:35:51 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-28 21:03:15 +0800 |
commit | 229ab52fe36c0882bac8aa84ae484a12d339242a (patch) | |
tree | e9f8f5de1309cec044b6eb8c83f3fc5a86e5beda /cask/src/cask/main | |
parent | 8b14cd206e008b4001f9b257f48870c8d40e8498 (diff) | |
download | cask-229ab52fe36c0882bac8aa84ae484a12d339242a.tar.gz cask-229ab52fe36c0882bac8aa84ae484a12d339242a.tar.bz2 cask-229ab52fe36c0882bac8aa84ae484a12d339242a.zip |
wip more readme
Diffstat (limited to 'cask/src/cask/main')
-rw-r--r-- | cask/src/cask/main/Decorators.scala | 11 | ||||
-rw-r--r-- | cask/src/cask/main/Main.scala | 17 |
2 files changed, 20 insertions, 8 deletions
diff --git a/cask/src/cask/main/Decorators.scala b/cask/src/cask/main/Decorators.scala index 91cf92f..b262039 100644 --- a/cask/src/cask/main/Decorators.scala +++ b/cask/src/cask/main/Decorators.scala @@ -33,9 +33,18 @@ trait Endpoint[R] extends BaseDecorator{ trait BaseDecorator{ type Input type InputParser[T] <: ArgReader[Input, T, ParamContext] - def getRawParams(ctx: ParamContext): Either[cask.model.Response, Map[String, Input]] + def getRawParams(ctx: ParamContext): Either[cask.model.Response, Decor[Input]] def getParamParser[T](implicit p: InputParser[T]) = p +} +object Decor{ + def apply[Input](params: (String, Input)*) = new Decor(params.toMap, () => ()) + def apply[Input](params: TraversableOnce[(String, Input)], cleanup: () => Unit = () => ()) = { + new Decor(params.toMap, cleanup) + } +} +class Decor[Input](val params: Map[String, Input], val cleanup: () => Unit){ + def withCleanup(newCleanUp: () => Unit) = new Decor(params, newCleanUp) } trait Decorator extends BaseDecorator { diff --git a/cask/src/cask/main/Main.scala b/cask/src/cask/main/Main.scala index 9ac0022..fb07e77 100644 --- a/cask/src/cask/main/Main.scala +++ b/cask/src/cask/main/Main.scala @@ -57,18 +57,23 @@ abstract class BaseMain{ case None => writeResponse(exchange, handleError(404)) case Some(((routes, metadata), bindings, remaining)) => val params = for{ - endpointParams <- metadata.endpoint.getRawParams(ParamContext(exchange, remaining)) - decoratorParams <- Util.sequenceEither( + decoratorParams <- Util.sequenceEither[Response, cask.main.Decor[_], Seq]( metadata.decorators.map(e => e.getRawParams(ParamContext(exchange, remaining))) ) - } yield (endpointParams ++ bindings.mapValues(metadata.endpoint.wrapPathSegment)) +: decoratorParams + endpointParams <- metadata.endpoint.getRawParams(ParamContext(exchange, remaining)) + } yield ( + (endpointParams.params ++ bindings.mapValues(metadata.endpoint.wrapPathSegment)) +: + decoratorParams.map(_.params), + () => {endpointParams.cleanup(); decoratorParams.foreach(_.cleanup())} + ) val result = params match{ case Left(resp) => resp - case Right(paramValues) => - metadata.entryPoint + case Right((paramValues, cleanup)) => + try metadata.entryPoint .asInstanceOf[EntryPoint[cask.main.Routes, cask.model.ParamContext]] .invoke(routes, ParamContext(exchange, remaining), paramValues) + finally cleanup() } @@ -86,8 +91,6 @@ abstract class BaseMain{ statusCode = 500) ) } - - } } } |