diff --git a/core/shared/src/main/scala/caseapp/core/parser/Parser.scala b/core/shared/src/main/scala/caseapp/core/parser/Parser.scala index 469255e0..2604643e 100644 --- a/core/shared/src/main/scala/caseapp/core/parser/Parser.scala +++ b/core/shared/src/main/scala/caseapp/core/parser/Parser.scala @@ -181,7 +181,7 @@ abstract class Parser[T] { } val reverseSteps0 = Step.DoubleDash(index) :: reverseSteps.reverse (res, reverseSteps0.reverse) - case opt :: rem if opt.startsWith("-") => + case opt :: rem if opt.startsWith("-") && opt != "-" => if (ignoreUnrecognized) helper(current, rem, opt :: extraArgsReverse, Step.IgnoredUnrecognized(index) :: reverseSteps, index + 1) else if (stopAtFirstUnrecognized) { @@ -282,6 +282,8 @@ abstract class Parser[T] { completer.optionName(value, stateOpt) case Step.Unrecognized(_, _) => completer.optionName(value, stateOpt) + case Step.StandardArgument(idx) if args0(idx) == "-" => + completer.optionName(value, stateOpt) case Step.MatchedOption(_, consumed, arg) if shift == 0 => completer.optionName(value, stateOpt) case Step.MatchedOption(_, consumed, arg) if consumed == 2 && shift == 1 => diff --git a/tests/shared/src/test/scala/caseapp/ParserTests.scala b/tests/shared/src/test/scala/caseapp/ParserTests.scala index 5ce7d63c..4e8656ea 100644 --- a/tests/shared/src/test/scala/caseapp/ParserTests.scala +++ b/tests/shared/src/test/scala/caseapp/ParserTests.scala @@ -48,5 +48,22 @@ object ParserTests extends TestSuite { assert(res.isLeft) } } + test("Keep single dashes in user arguments") { + case class Helper(n: Int, value: String) + val parser = + Argument[Int](Arg("n")) :: + Argument[String](Arg("value")).withDefault(() => Some("default")) :: + NilParser + test("single") { + val res = parser.to[Helper].parse(Seq("-n", "2", "-")) + val expected = Right((Helper(2, "default"), Seq("-"))) + assert(res == expected) + } + test("several") { + val res = parser.to[Helper].parse(Seq("-", "a", "-", "-n", "2", "-")) + val expected = Right((Helper(2, "default"), Seq("-", "a", "-", "-"))) + assert(res == expected) + } + } } }