From dfaece8336adc803b9088621b45bdba1deb3213f Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 26 Jul 2018 12:11:55 +0800 Subject: Cleanup --- cask/src/cask/endpoints/FormEndpoint.scala | 6 ++-- cask/src/cask/endpoints/JsonEndpoint.scala | 6 ++-- cask/src/cask/endpoints/StaticEndpoints.scala | 6 ++-- cask/src/cask/endpoints/WebEndpoints.scala | 4 +-- cask/src/cask/main/Main.scala | 4 +-- cask/src/cask/main/Routes.scala | 43 +++++++++++++++++---------- cask/test/src/test/cask/Decorated.scala | 2 +- cask/test/src/test/cask/FailureTests.scala | 2 +- 8 files changed, 43 insertions(+), 30 deletions(-) (limited to 'cask') diff --git a/cask/src/cask/endpoints/FormEndpoint.scala b/cask/src/cask/endpoints/FormEndpoint.scala index f042d74..2d9fc1f 100644 --- a/cask/src/cask/endpoints/FormEndpoint.scala +++ b/cask/src/cask/endpoints/FormEndpoint.scala @@ -37,9 +37,9 @@ object FormReader{ class postForm(val path: String, override val subpath: Boolean = false) extends Routes.Endpoint[Response]{ val methods = Seq("post") - type InputType = Seq[FormValue] + type Input = Seq[FormValue] type InputParser[T] = FormReader[T] - def getParamValues(ctx: ParamContext) = { + def getRawParams(ctx: ParamContext) = { val formData = FormParserFactory.builder().build().createParser(ctx.exchange).parseBlocking() val formDataBindings = formData @@ -49,6 +49,6 @@ class postForm(val path: String, override val subpath: Boolean = false) extends .toMap formDataBindings } - def wrapPathSegment(s: String): InputType = Seq(FormValue.Plain(s, new io.undertow.util.HeaderMap)) + def wrapPathSegment(s: String): Input = Seq(FormValue.Plain(s, new io.undertow.util.HeaderMap)) } diff --git a/cask/src/cask/endpoints/JsonEndpoint.scala b/cask/src/cask/endpoints/JsonEndpoint.scala index 19c7b8a..80fac9a 100644 --- a/cask/src/cask/endpoints/JsonEndpoint.scala +++ b/cask/src/cask/endpoints/JsonEndpoint.scala @@ -26,9 +26,9 @@ object JsReader{ } class postJson(val path: String, override val subpath: Boolean = false) extends Routes.Endpoint[Response]{ val methods = Seq("post") - type InputType = ujson.Js.Value + type Input = ujson.Js.Value type InputParser[T] = JsReader[T] - def getParamValues(ctx: ParamContext) = + def getRawParams(ctx: ParamContext) = ujson.read(new String(ctx.exchange.getInputStream.readAllBytes())).obj.toMap - def wrapPathSegment(s: String): InputType = ujson.Js.Str(s) + def wrapPathSegment(s: String): Input = ujson.Js.Str(s) } diff --git a/cask/src/cask/endpoints/StaticEndpoints.scala b/cask/src/cask/endpoints/StaticEndpoints.scala index a88781e..5d57144 100644 --- a/cask/src/cask/endpoints/StaticEndpoints.scala +++ b/cask/src/cask/endpoints/StaticEndpoints.scala @@ -6,7 +6,7 @@ import cask.model.ParamContext class static(val path: String) extends Routes.Endpoint[String] { val methods = Seq("get") - type InputType = Seq[String] + type Input = Seq[String] type InputParser[T] = QueryParamReader[T] override def subpath = true def wrapOutput(t: String) = t @@ -14,6 +14,6 @@ class static(val path: String) extends Routes.Endpoint[String] { Router.Result.Success(cask.model.Static(t + "/" + ctx.remaining.mkString("/"))) } - def getParamValues(ctx: ParamContext) = Map() - def wrapPathSegment(s: String): InputType = Seq(s) + def getRawParams(ctx: ParamContext) = Map() + def wrapPathSegment(s: String): Input = Seq(s) } diff --git a/cask/src/cask/endpoints/WebEndpoints.scala b/cask/src/cask/endpoints/WebEndpoints.scala index 1885475..82009df 100644 --- a/cask/src/cask/endpoints/WebEndpoints.scala +++ b/cask/src/cask/endpoints/WebEndpoints.scala @@ -9,9 +9,9 @@ import collection.JavaConverters._ trait WebEndpoint extends Routes.Endpoint[BaseResponse]{ - type InputType = Seq[String] + type Input = Seq[String] type InputParser[T] = QueryParamReader[T] - def getParamValues(ctx: ParamContext) = ctx.exchange.getQueryParameters + def getRawParams(ctx: ParamContext) = ctx.exchange.getQueryParameters .asScala .map{case (k, vs) => (k, vs.asScala.toArray.toSeq)} .toMap diff --git a/cask/src/cask/main/Main.scala b/cask/src/cask/main/Main.scala index 763b12a..f28ae12 100644 --- a/cask/src/cask/main/Main.scala +++ b/cask/src/cask/main/Main.scala @@ -57,9 +57,9 @@ abstract class BaseMain{ case None => writeResponse(exchange, handleError(404)) case Some(((routes, metadata), bindings, remaining)) => val providers = - Seq(metadata.endpoint.getParamValues(ParamContext(exchange, remaining)) ++ + Seq(metadata.endpoint.getRawParams(ParamContext(exchange, remaining)) ++ bindings.mapValues(metadata.endpoint.wrapPathSegment)) ++ - metadata.decorators.map(e => e.getParamValues(ParamContext(exchange, remaining))) + metadata.decorators.map(e => e.getRawParams(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 c3d2bfc..76a84d0 100644 --- a/cask/src/cask/main/Routes.scala +++ b/cask/src/cask/main/Routes.scala @@ -1,8 +1,7 @@ package cask.main -import cask.internal.Router import cask.internal.Router.{ArgReader, EntryPoint} -import cask.model.{BaseResponse, ParamContext} +import cask.model.ParamContext import scala.reflect.macros.blackbox.Context import language.experimental.macros @@ -17,30 +16,44 @@ object Routes{ 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 + def getRawParams(ctx: ParamContext): Map[String, Input] + def wrapPathSegment(s: String): Input } + + /** + * The core interface of decorator annotations: the decorator provides "raw" + * values to the annotated function via `getRawParams`, which then get + * processed by `getParamParser` into the correct argument types before + * being passed to the function. + * + * For a trivial "provide value" decorator, `getRawParams` would return the + * final param value and `getParamParser` would return a no-op parser. For + * a decorator that takes its input as query-params, JSON, or similar, + * `getRawParams` would provide raw query/JSON/etc. values and + * `getParamParser` would be responsible for processing those into the + * correct parameter types. + */ trait BaseDecorator{ - type InputType - type InputParser[T] - def getParamValues(ctx: ParamContext): Map[String, InputType] - def parseMethodInput[T](implicit p: InputParser[T]) = p + type Input + type InputParser[T] <: ArgReader[Input, T, ParamContext] + def getRawParams(ctx: ParamContext): Map[String, Input] + def getParamParser[T](implicit p: InputParser[T]) = p } trait Decorator extends BaseDecorator { - type InputType = Any - type InputParser[T] = NoOpParser[InputType, T] + type Input = Any + type InputParser[T] = NoOpParser[Input, T] } - class NoOpParser[InputType, T] extends ArgReader[InputType, T, ParamContext] { + class NoOpParser[Input, T] extends ArgReader[Input, T, ParamContext] { def arity = 1 - def read(ctx: ParamContext, label: String, input: InputType) = input.asInstanceOf[T] + def read(ctx: ParamContext, label: String, input: Input) = input.asInstanceOf[T] } object NoOpParser{ - implicit def instance[InputType, T] = new NoOpParser[InputType, T] + implicit def instance[Input, T] = new NoOpParser[Input, T] } case class EndpointMetadata[T](decorators: Seq[BaseDecorator], @@ -80,8 +93,8 @@ object Routes{ weakTypeOf[T], (t: router.c.universe.Tree) => q"${annotObjectSyms.head}.wrapMethodOutput(ctx, $t)", c.weakTypeOf[ParamContext], - annotObjectSyms.map(annotObjectSym => q"$annotObjectSym.parseMethodInput"), - annotObjectSyms.map(annotObjectSym => tq"$annotObjectSym.InputType") + annotObjectSyms.map(annotObjectSym => q"$annotObjectSym.getParamParser"), + annotObjectSyms.map(annotObjectSym => tq"$annotObjectSym.Input") ) diff --git a/cask/test/src/test/cask/Decorated.scala b/cask/test/src/test/cask/Decorated.scala index 94a1ce2..c6e048a 100644 --- a/cask/test/src/test/cask/Decorated.scala +++ b/cask/test/src/test/cask/Decorated.scala @@ -4,7 +4,7 @@ import cask.model.ParamContext object Decorated extends cask.MainRoutes{ class myDecorator extends cask.Routes.Decorator { - def getParamValues(ctx: ParamContext) = Map("extra" -> 31337) + def getRawParams(ctx: ParamContext) = Map("extra" -> 31337) } @myDecorator() diff --git a/cask/test/src/test/cask/FailureTests.scala b/cask/test/src/test/cask/FailureTests.scala index fcfed79..c2db0f4 100644 --- a/cask/test/src/test/cask/FailureTests.scala +++ b/cask/test/src/test/cask/FailureTests.scala @@ -5,7 +5,7 @@ import utest._ object FailureTests extends TestSuite { class myDecorator extends cask.Routes.Decorator { - def getParamValues(ctx: ParamContext) = Map("extra" -> 31337) + def getRawParams(ctx: ParamContext) = Map("extra" -> 31337) } val tests = Tests{ -- cgit v1.2.3