summaryrefslogtreecommitdiff
path: root/cask/src/cask/endpoints/WebSocketEndpoint.scala
diff options
context:
space:
mode:
Diffstat (limited to 'cask/src/cask/endpoints/WebSocketEndpoint.scala')
-rw-r--r--cask/src/cask/endpoints/WebSocketEndpoint.scala52
1 files changed, 52 insertions, 0 deletions
diff --git a/cask/src/cask/endpoints/WebSocketEndpoint.scala b/cask/src/cask/endpoints/WebSocketEndpoint.scala
new file mode 100644
index 0000000..a795afd
--- /dev/null
+++ b/cask/src/cask/endpoints/WebSocketEndpoint.scala
@@ -0,0 +1,52 @@
+package cask.endpoints
+
+import cask.internal.Router
+import cask.model.{ParamContext, Subpath}
+import io.undertow.server.HttpServerExchange
+import io.undertow.websockets.WebSocketConnectionCallback
+trait WebsocketParam[T] extends Router.ArgReader[Seq[String], T, cask.model.ParamContext]
+
+object WebsocketParam{
+ class NilParam[T](f: (ParamContext, String) => T) extends WebsocketParam[T]{
+ def arity = 0
+ def read(ctx: ParamContext, label: String, v: Seq[String]): T = f(ctx, label)
+ }
+ implicit object HttpExchangeParam extends NilParam[HttpServerExchange](
+ (ctx, label) => ctx.exchange
+ )
+ implicit object SubpathParam extends NilParam[Subpath](
+ (ctx, label) => new Subpath(ctx.remaining)
+ )
+ class SimpleParam[T](f: String => T) extends WebsocketParam[T]{
+ def arity = 1
+ def read(ctx: cask.model.ParamContext, label: String, v: Seq[String]): T = f(v.head)
+ }
+
+ implicit object StringParam extends SimpleParam[String](x => x)
+ implicit object BooleanParam extends SimpleParam[Boolean](_.toBoolean)
+ implicit object ByteParam extends SimpleParam[Byte](_.toByte)
+ implicit object ShortParam extends SimpleParam[Short](_.toShort)
+ implicit object IntParam extends SimpleParam[Int](_.toInt)
+ implicit object LongParam extends SimpleParam[Long](_.toLong)
+ implicit object DoubleParam extends SimpleParam[Double](_.toDouble)
+ implicit object FloatParam extends SimpleParam[Float](_.toFloat)
+}
+
+sealed trait WebsocketResult
+object WebsocketResult{
+ implicit class Response(val value: cask.model.Response) extends WebsocketResult
+ implicit class Listener(val value: WebSocketConnectionCallback) extends WebsocketResult
+}
+
+class websocket(val path: String, subpath: Boolean = false) extends cask.main.BaseEndpoint{
+ type Output = WebsocketResult
+ val methods = Seq("websocket")
+ type Input = Seq[String]
+ type InputParser[T] = WebsocketParam[T]
+ type Returned = Router.Result[WebsocketResult]
+ def wrapFunction(ctx: ParamContext, delegate: Delegate): Returned = delegate(Map())
+
+ def wrapPathSegment(s: String): Input = Seq(s)
+
+
+}