summaryrefslogtreecommitdiff
path: root/cask
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-07-26 12:11:55 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-07-26 12:11:55 +0800
commitdfaece8336adc803b9088621b45bdba1deb3213f (patch)
tree057d33cac767e0c291897f78cbb0bccba306fa7a /cask
parentcdc254b077235efc8a1ad1158d2a0245730262c6 (diff)
downloadcask-dfaece8336adc803b9088621b45bdba1deb3213f.tar.gz
cask-dfaece8336adc803b9088621b45bdba1deb3213f.tar.bz2
cask-dfaece8336adc803b9088621b45bdba1deb3213f.zip
Cleanup
Diffstat (limited to 'cask')
-rw-r--r--cask/src/cask/endpoints/FormEndpoint.scala6
-rw-r--r--cask/src/cask/endpoints/JsonEndpoint.scala6
-rw-r--r--cask/src/cask/endpoints/StaticEndpoints.scala6
-rw-r--r--cask/src/cask/endpoints/WebEndpoints.scala4
-rw-r--r--cask/src/cask/main/Main.scala4
-rw-r--r--cask/src/cask/main/Routes.scala43
-rw-r--r--cask/test/src/test/cask/Decorated.scala2
-rw-r--r--cask/test/src/test/cask/FailureTests.scala2
8 files changed, 43 insertions, 30 deletions
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{