ndmitchell / cmdargs

Haskell library for command line argument processing
Other
91 stars 12 forks source link

Wondering how to make a required argument. #51

Open Magicloud opened 6 years ago

Magicloud commented 6 years ago

With System.Console.CmdArgs.Implicit, I mean. Or I should check the result myself.

ndmitchell commented 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.

Magicloud commented 6 years ago

Thanks for the reply. So tradition req in getopt is not mapped to a thing here?

ndmitchell commented 6 years ago

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.

OsePedro commented 3 years ago

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).