Skip to content

Commit

Permalink
Handle -- to force args (#228)
Browse files Browse the repository at this point in the history
* Handle -- to force args

* Fix names
  • Loading branch information
vigoo authored Jul 16, 2023
1 parent bc0dd10 commit 9d204b8
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
15 changes: 11 additions & 4 deletions zio-cli/shared/src/main/scala/zio/cli/Command.scala
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ object Command {
}
}

private def splitForcedArgs(args: List[String]): (List[String], List[String]) = {
val (remainingArgs, forcedArgs) = args.span(_ != "--")
(remainingArgs, forcedArgs.drop(1))
}

final case class Single[OptionsType, ArgsType](
val name: String,
help: HelpDoc,
Expand Down Expand Up @@ -147,10 +152,12 @@ object Command {
)
}
}
tuple <- self.options.validate(unCluster(commandOptionsAndArgs), conf)
(commandArgs, optionsType) = tuple
tuple <- self.args.validate(commandArgs, conf)
(argsLeftover, argsType) = tuple
tuple1 = splitForcedArgs(commandOptionsAndArgs)
(optionsAndArgs, forcedCommandArgs) = tuple1
tuple2 <- self.options.validate(unCluster(optionsAndArgs), conf)
(commandArgs, optionsType) = tuple2
tuple <- self.args.validate(commandArgs ++ forcedCommandArgs, conf)
(argsLeftover, argsType) = tuple
} yield CommandDirective.userDefined(argsLeftover, (optionsType, argsType))

parseBuiltInArgs orElse parseUserDefinedArgs
Expand Down
16 changes: 15 additions & 1 deletion zio-cli/shared/src/test/scala/zio/cli/CommandSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,21 @@ object CommandSpec extends ZIOSpecDefault {
)
)
}
)
),
test("cmd opts -- args") {
val command =
Command("cmd", Options.text("something").optional ++ Options.boolean("verbose").alias("v"), Args.text.*)

for {
r1 <- command.parse(List("cmd", "-v", "--something", "abc", "something"), CliConfig.default)
r2 <- command.parse(List("cmd", "-v", "--", "--something", "abc", "something"), CliConfig.default)
r3 <- command.parse(List("cmd", "--", "-v", "--something", "abc", "something"), CliConfig.default)
} yield assertTrue(
r1 == CommandDirective.UserDefined(Nil, ((Some("abc"), true), List("something"))),
r2 == CommandDirective.UserDefined(Nil, ((None, true), List("--something", "abc", "something"))),
r3 == CommandDirective.UserDefined(Nil, ((None, false), List("-v", "--something", "abc", "something")))
)
}
)

object Tail {
Expand Down

0 comments on commit 9d204b8

Please sign in to comment.