summaryrefslogtreecommitdiff
path: root/cask/src/cask/router/Runtime.scala
diff options
context:
space:
mode:
Diffstat (limited to 'cask/src/cask/router/Runtime.scala')
-rw-r--r--cask/src/cask/router/Runtime.scala39
1 files changed, 39 insertions, 0 deletions
diff --git a/cask/src/cask/router/Runtime.scala b/cask/src/cask/router/Runtime.scala
new file mode 100644
index 0000000..4fbbb48
--- /dev/null
+++ b/cask/src/cask/router/Runtime.scala
@@ -0,0 +1,39 @@
+package cask.router
+
+object Runtime{
+
+ def tryEither[T](t: => T, error: Throwable => Result.ParamError) = {
+ try Right(t)
+ catch{ case e: Throwable => Left(error(e))}
+ }
+
+
+ def validate(args: Seq[Either[Seq[Result.ParamError], Any]]): Result[Seq[Any]] = {
+ val lefts = args.collect{case Left(x) => x}.flatten
+
+ if (lefts.nonEmpty) Result.Error.InvalidArguments(lefts)
+ else {
+ val rights = args.collect{case Right(x) => x}
+ Result.Success(rights)
+ }
+ }
+
+ def makeReadCall[I, C](dict: Map[String, I],
+ ctx: C,
+ default: => Option[Any],
+ arg: ArgSig[I, _, _, C]) = {
+ arg.reads.arity match{
+ case 0 =>
+ tryEither(
+ arg.reads.read(ctx, arg.name, null.asInstanceOf[I]), Result.ParamError.DefaultFailed(arg, _)).left.map(Seq(_))
+ case 1 =>
+ dict.get(arg.name) match{
+ case None =>
+ tryEither(default.get, Result.ParamError.DefaultFailed(arg, _)).left.map(Seq(_))
+
+ case Some(x) =>
+ tryEither(arg.reads.read(ctx, arg.name, x), Result.ParamError.Invalid(arg, x.toString, _)).left.map(Seq(_))
+ }
+ }
+ }
+} \ No newline at end of file