summaryrefslogtreecommitdiff
path: root/cask/src/cask/main
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-07-28 20:35:51 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-07-28 21:03:15 +0800
commit229ab52fe36c0882bac8aa84ae484a12d339242a (patch)
treee9f8f5de1309cec044b6eb8c83f3fc5a86e5beda /cask/src/cask/main
parent8b14cd206e008b4001f9b257f48870c8d40e8498 (diff)
downloadcask-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.scala11
-rw-r--r--cask/src/cask/main/Main.scala17
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)
)
}
-
-
}
}
}