Open Magicloud opened 6 years ago
You mean if the user doesn't type --foo=1
then it raises an error? You'll need to check that yourself as "normal" command line programs don't typically require flags, so it isn't supported by default.
Thanks for the reply. So tradition req in getopt is not mapped to a thing here?
Sorry for the seriously long delay in replying!
In getopt, req is equivalent to banning --foo
unless you write --foo=test
with some argument.
In cmdargs, req is the default, you always have to write --foo=test
(unless you are using a boolean flag, or a Maybe), and you can remove the "req" feature by writing opt "default"
- which makes --foo
equivalent to --foo=default
.
Would it be worth adding support for Either a b
(for any supported atomic type b
), as a more informative alternative to Maybe b
? That would allow us to write things like:
data MyCmdArgs = MyCmdArgs {mandatoryInt :: Either String Int, optionalInt :: Int}
myCmdArgs =
MyCmdArgs {
mandatoryInt = Left "You must specify --mandatoryInt",
optionalInt = def
}
which would help to reduce some of the work involved in telling the user which mandatory flags they've omitted.
"normal" command line programs don't typically require flags
With some applications that take multiple mandatory command-line inputs that are used in different ways, you can improve the user experience by using flags to name some of the mandatory arguments, so that the user won't have to provide them in a fixed order (which can lead to useless output, or even data loss, if they get the order wrong). Also, with applications like ffmpeg
that can take arbitrary numbers of input and output files, you need at least one flag to distinguish between the two types of files (e.g. in ffmpeg
, you identify each input video with the -i
flag).
With
System.Console.CmdArgs.Implicit
, I mean. Or I should check the result myself.