diff options
-rw-r--r-- | cask/src/cask/endpoints/FormEndpoint.scala | 4 | ||||
-rw-r--r-- | cask/src/cask/endpoints/JsonEndpoint.scala | 4 | ||||
-rw-r--r-- | cask/src/cask/endpoints/StaticEndpoints.scala | 4 | ||||
-rw-r--r-- | cask/src/cask/endpoints/WebEndpoints.scala | 5 | ||||
-rw-r--r-- | cask/src/cask/main/Decorators.scala | 53 | ||||
-rw-r--r-- | cask/src/cask/main/Routes.scala | 51 | ||||
-rw-r--r-- | cask/src/cask/package.scala | 3 | ||||
-rw-r--r-- | cask/test/src/test/cask/Decorated.scala | 4 | ||||
-rw-r--r-- | cask/test/src/test/cask/FailureTests.scala | 2 |
9 files changed, 68 insertions, 62 deletions
diff --git a/cask/src/cask/endpoints/FormEndpoint.scala b/cask/src/cask/endpoints/FormEndpoint.scala index 2a7fbd2..c58c765 100644 --- a/cask/src/cask/endpoints/FormEndpoint.scala +++ b/cask/src/cask/endpoints/FormEndpoint.scala @@ -1,7 +1,7 @@ package cask.endpoints import cask.internal.{Router, Util} -import cask.main.Routes +import cask.main.{Endpoint, Routes} import cask.model.{FormValue, ParamContext, Response} import io.undertow.server.handlers.form.FormParserFactory @@ -34,7 +34,7 @@ object FormReader{ def read(ctx: ParamContext, label: String, input: Seq[FormValue]) = input.map(_.asFile.get) } } -class postForm(val path: String, override val subpath: Boolean = false) extends Routes.Endpoint[Response]{ +class postForm(val path: String, override val subpath: Boolean = false) extends Endpoint[Response]{ val methods = Seq("post") type Input = Seq[FormValue] diff --git a/cask/src/cask/endpoints/JsonEndpoint.scala b/cask/src/cask/endpoints/JsonEndpoint.scala index d9d39c3..425f942 100644 --- a/cask/src/cask/endpoints/JsonEndpoint.scala +++ b/cask/src/cask/endpoints/JsonEndpoint.scala @@ -2,7 +2,7 @@ package cask.endpoints import cask.internal.{Router, Util} import cask.internal.Router.EntryPoint -import cask.main.Routes +import cask.main.{Endpoint, Routes} import cask.model.{ParamContext, Response} @@ -24,7 +24,7 @@ object JsReader{ } } } -class postJson(val path: String, override val subpath: Boolean = false) extends Routes.Endpoint[Response]{ +class postJson(val path: String, override val subpath: Boolean = false) extends Endpoint[Response]{ val methods = Seq("post") type Input = ujson.Js.Value type InputParser[T] = JsReader[T] diff --git a/cask/src/cask/endpoints/StaticEndpoints.scala b/cask/src/cask/endpoints/StaticEndpoints.scala index 31528aa..436fd25 100644 --- a/cask/src/cask/endpoints/StaticEndpoints.scala +++ b/cask/src/cask/endpoints/StaticEndpoints.scala @@ -1,10 +1,10 @@ package cask.endpoints import cask.internal.Router -import cask.main.Routes +import cask.main.Endpoint import cask.model.ParamContext -class static(val path: String) extends Routes.Endpoint[String] { +class static(val path: String) extends Endpoint[String] { val methods = Seq("get") type Input = Seq[String] type InputParser[T] = QueryParamReader[T] diff --git a/cask/src/cask/endpoints/WebEndpoints.scala b/cask/src/cask/endpoints/WebEndpoints.scala index cd707b8..d0ac46d 100644 --- a/cask/src/cask/endpoints/WebEndpoints.scala +++ b/cask/src/cask/endpoints/WebEndpoints.scala @@ -1,14 +1,13 @@ package cask.endpoints import cask.internal.Router -import cask.internal.Router.EntryPoint -import cask.main.Routes +import cask.main.Endpoint import cask.model.{BaseResponse, ParamContext} import collection.JavaConverters._ -trait WebEndpoint extends Routes.Endpoint[BaseResponse]{ +trait WebEndpoint extends Endpoint[BaseResponse]{ type Input = Seq[String] type InputParser[T] = QueryParamReader[T] def getRawParams(ctx: ParamContext) = Right( diff --git a/cask/src/cask/main/Decorators.scala b/cask/src/cask/main/Decorators.scala new file mode 100644 index 0000000..91cf92f --- /dev/null +++ b/cask/src/cask/main/Decorators.scala @@ -0,0 +1,53 @@ +package cask.main + +import cask.internal.Router.ArgReader +import cask.model.ParamContext + + +trait Endpoint[R] extends BaseDecorator{ + + val path: String + val methods: Seq[String] + def subpath: Boolean = false + def wrapMethodOutput(ctx: ParamContext,t: R): cask.internal.Router.Result[Any] = { + cask.internal.Router.Result.Success(t) + } + + 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 Input + type InputParser[T] <: ArgReader[Input, T, ParamContext] + def getRawParams(ctx: ParamContext): Either[cask.model.Response, Map[String, Input]] + def getParamParser[T](implicit p: InputParser[T]) = p + +} + +trait Decorator extends BaseDecorator { + type Input = Any + type InputParser[T] = NoOpParser[Input, T] +} + +class NoOpParser[Input, T] extends ArgReader[Input, T, ParamContext] { + def arity = 1 + + def read(ctx: ParamContext, label: String, input: Input) = input.asInstanceOf[T] +} +object NoOpParser{ + implicit def instance[Input, T] = new NoOpParser[Input, T] +}
\ No newline at end of file diff --git a/cask/src/cask/main/Routes.scala b/cask/src/cask/main/Routes.scala index 60992b5..1c49e42 100644 --- a/cask/src/cask/main/Routes.scala +++ b/cask/src/cask/main/Routes.scala @@ -1,61 +1,12 @@ package cask.main -import cask.internal.Router.{ArgReader, EntryPoint} +import cask.internal.Router.EntryPoint import cask.model.ParamContext import scala.reflect.macros.blackbox.Context import language.experimental.macros object Routes{ - - trait Endpoint[R] extends BaseDecorator{ - - val path: String - val methods: Seq[String] - def subpath: Boolean = false - def wrapMethodOutput(ctx: ParamContext,t: R): cask.internal.Router.Result[Any] = { - cask.internal.Router.Result.Success(t) - } - - 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 Input - type InputParser[T] <: ArgReader[Input, T, ParamContext] - def getRawParams(ctx: ParamContext): Either[cask.model.Response, Map[String, Input]] - def getParamParser[T](implicit p: InputParser[T]) = p - - } - - trait Decorator extends BaseDecorator { - type Input = Any - type InputParser[T] = NoOpParser[Input, T] - } - - class NoOpParser[Input, T] extends ArgReader[Input, T, ParamContext] { - def arity = 1 - - def read(ctx: ParamContext, label: String, input: Input) = input.asInstanceOf[T] - } - object NoOpParser{ - implicit def instance[Input, T] = new NoOpParser[Input, T] - } - case class EndpointMetadata[T](decorators: Seq[BaseDecorator], endpoint: Endpoint[_], entryPoint: EntryPoint[T, ParamContext]) diff --git a/cask/src/cask/package.scala b/cask/src/cask/package.scala index b791eb1..37e61e2 100644 --- a/cask/src/cask/package.scala +++ b/cask/src/cask/package.scala @@ -29,5 +29,8 @@ package object cask { type Routes = main.Routes val Routes = main.Routes type Main = main.Main + type Decorator = main.Decorator + type Endpoint[R] = main.Endpoint[R] + type BaseDecorator = main.BaseDecorator } diff --git a/cask/test/src/test/cask/Decorated.scala b/cask/test/src/test/cask/Decorated.scala index 3677203..bd27647 100644 --- a/cask/test/src/test/cask/Decorated.scala +++ b/cask/test/src/test/cask/Decorated.scala @@ -6,10 +6,10 @@ object Decorated extends cask.MainRoutes{ class User{ override def toString = "[haoyi]" } - class loggedIn extends cask.Routes.Decorator { + class loggedIn extends cask.Decorator { def getRawParams(ctx: ParamContext) = Right(Map("user" -> new User())) } - class withExtra extends cask.Routes.Decorator { + class withExtra extends cask.Decorator { def getRawParams(ctx: ParamContext) = Right(Map("extra" -> 31337)) } diff --git a/cask/test/src/test/cask/FailureTests.scala b/cask/test/src/test/cask/FailureTests.scala index 03f3777..dd6914a 100644 --- a/cask/test/src/test/cask/FailureTests.scala +++ b/cask/test/src/test/cask/FailureTests.scala @@ -4,7 +4,7 @@ import cask.model.ParamContext import utest._ object FailureTests extends TestSuite { - class myDecorator extends cask.Routes.Decorator { + class myDecorator extends cask.Decorator { def getRawParams(ctx: ParamContext) = Right(Map("extra" -> 31337)) } val tests = Tests{ |