It's easy to specify mutually exclusive options with optparse-applicative:
data Exclusive = E1 | E2
exclusiveParser :: Parser ExclusiveOption
exclusiveParser =
(flag' E1 (short 'e1')
<|> (flag' E2 (short 'e2')
The above parser will parse either -e1
or -e2
, but not both. The default optparse-applicative action when both -e1
and -e2
are provided is to print the application's usage message. I would like to provide the user with a specific error message informing them that they cannot provide both -e1
and -e2
, but I don't see an obvious way to do that.
Any suggestions (or solutions) would be appreciated?
I'm not familiar with optparse-applicative, so I'm not sure what error-printing facilities it provides. (Sometimes parser combinator libraries offer a primitive that changes the error that's printed, but I didn't see anything for that on a quick skim of the optparse-applicative docs. Entirely possible that I missed it.)
But in case nothing is available from the library itself, you could always print your own message by accepting both flags; e.g.
data Exclusive = E1 | E2 | Both
exclusiveParser
= (flag' E1 (short 'e'))
<|> (flag' E2 (short 'f'))
<|> (flag' Both (short 'e') <* flag' Both (short 'f'))
Then in your top-level handler (i.e. once the options are all parsed), if you see Both
, you can issue an error message of your own crafting at that moment.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With