Skip to content

Commit cfa7c52

Browse files
authored
Merge pull request #497 from Hydrospheredata/fix/default_arg_fix
arg with default value shouldn't ignore input value with invalid type
2 parents 849941a + 41e24e7 commit cfa7c52

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

mist-lib/src/main/scala/mist/api/UserArg.scala

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package mist.api
22

3-
import mist.api.data.JsMap
3+
import mist.api.data.{JsMap, JsNull}
44
import mist.api.encoding.JsExtractor
55

66
trait UserArg[A] extends ArgDef[A] { self =>
@@ -28,12 +28,18 @@ class NamedUserArg[A](name: String)(implicit ext: JsExtractor[A]) extends UserAr
2828
override def describe(): Seq[ArgInfo] = Seq(UserInputArgument(name, ext.`type`))
2929
override def extract(ctx: FnContext): Extraction[A] =
3030
ext.transformFailure(f => Failed.InvalidField(name, f))(ctx.params.fieldValue(name))
31+
32+
override def toString: String = s"${getClass.getSimpleName}($name)"
3133
}
3234

3335
class NamedUserArgWithDefault[A](name: String, default: A)(implicit ext: JsExtractor[A]) extends UserArg[A] {
34-
private val optExt = ext.orElse(default)
3536
override def describe(): Seq[ArgInfo] = Seq(UserInputArgument(name, MOption(ext.`type`)))
36-
override def extract(ctx: FnContext): Extraction[A] =
37-
optExt.transformFailure(f => Failed.InvalidField(name, f))(ctx.params.fieldValue(name))
37+
override def extract(ctx: FnContext): Extraction[A] = {
38+
ctx.params.fieldValue(name) match {
39+
case JsNull => Extracted(default)
40+
case x => ext.transformFailure(f => Failed.InvalidField(name, f))(x)
41+
}
42+
}
43+
override def toString: String = s"${getClass.getSimpleName}($name, $default)"
3844
}
3945

mist-lib/src/test/scala/mist/api/UserArgsSpec.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class UserArgsSpec extends FunSpec with Matchers {
4848
(arg[Boolean]("b"), JsMap("b" -> true.js), Extracted(true)),
4949
(arg[Boolean]("b", false), JsMap.empty, Extracted(false)),
5050
(arg[Boolean]("b", true), JsMap("b" -> false.js), Extracted(false)),
51+
(arg[Boolean]("c", true), JsMap("c" -> "2".js), failed),
5152
(arg[Boolean]("b"), JsMap.empty, failed),
5253
(arg[Option[Boolean]]("b"),JsMap("b" -> true.js), Extracted(Some(true))),
5354
(arg[Option[Boolean]]("b"),JsMap.empty, Extracted(None)),

0 commit comments

Comments
 (0)