summaryrefslogtreecommitdiff
path: root/cask/src/cask/internal/Router.scala
diff options
context:
space:
mode:
Diffstat (limited to 'cask/src/cask/internal/Router.scala')
-rw-r--r--cask/src/cask/internal/Router.scala26
1 files changed, 19 insertions, 7 deletions
diff --git a/cask/src/cask/internal/Router.scala b/cask/src/cask/internal/Router.scala
index 9fa9b60..64af4cd 100644
--- a/cask/src/cask/internal/Router.scala
+++ b/cask/src/cask/internal/Router.scala
@@ -2,6 +2,7 @@ package cask.internal
import language.experimental.macros
import scala.annotation.StaticAnnotation
+import scala.collection.mutable
import scala.reflect.macros.blackbox.Context
/**
@@ -44,14 +45,25 @@ object Router{
argSignatures: Seq[Seq[ArgSig[_, T, _, C]]],
doc: Option[String],
invoke0: (T, C, Seq[Map[String, Any]], Seq[Seq[ArgSig[Any, _, _, C]]]) => Result[Any]){
+
+ val firstArgs = argSignatures.head
+ .map(x => x.name -> x)
+ .toMap[String, Router.ArgSig[_, T, _, C]]
+
def invoke(target: T,
ctx: C,
paramLists: Seq[Map[String, Any]]): Result[Any] = {
- val unknown = paramLists.head.keySet -- argSignatures.head.map(_.name).toSet
- val missing = argSignatures.head.filter(as =>
- as.reads.arity != 0 && !paramLists.head.contains(as.name) && as.default.isEmpty
- )
+ val missing = mutable.Buffer.empty[Router.ArgSig[_, T, _, C]]
+
+ val unknown = paramLists.head.keys.filter(!firstArgs.contains(_))
+
+ for(k <- firstArgs.keys) {
+ if (!paramLists.head.contains(k)) {
+ val as = firstArgs(k)
+ if (as.reads.arity != 0 && as.default.isEmpty) missing.append(as)
+ }
+ }
if (missing.nonEmpty || unknown.nonEmpty) Result.Error.MismatchedArguments(missing, unknown.toSeq)
else {
@@ -313,9 +325,9 @@ class Router[C <: Context](val c: C) {
${method.name.toString},
${argSigs.toList},
${methodDoc match{
- case None => q"scala.None"
- case Some(s) => q"scala.Some($s)"
- }},
+ case None => q"scala.None"
+ case Some(s) => q"scala.Some($s)"
+ }},
(
$baseArgSym: $curCls,
$ctxSymbol: $ctx,