pcapriotti / pcapriotti/optparse-applicative
combining parsers with overlapping flags
Nobody has claimed this yet.
- Dominant language
- Haskell
- Stars
- 959
- Forks
- 123
- Avg merge
- 3d 19h
- Merged PRs (30d)
- 1
Description
Could optparse-applicative provide more help when combining parsers that have the same flag names. For example:
mapOptName :: (OptName -> OptName) -> Parser a -> Parser a
mapOptName f (OptP x) = OptP (mapOption x)
where
mapOption :: Option a -> Option a
mapOption (Option r p) = Option (mapReader r) p
mapReader :: OptReader a -> OptReader a
mapReader (OptReader n x y) = OptReader (map f n) x y
mapReader (FlagReader n a) = FlagReader (map f n) a
mapReader x = x
mapOptName f (MultP x y) = MultP (mapOptName f x) (mapOptName f y)
mapOptName f (AltP x y) = AltP (mapOptName f x) (mapOptName f y)
mapOptName f (BindP x y) = BindP (mapOptName f x) (mapOptName f . y)
mapOptName f x = x
addPrefix p (OptShort c) = OptLong (p ++ "-" ++ [c])
addPrefix p (OptLong c) = OptLong (p ++ "-" ++ c)
Lets me write something like:
step :: Parser Step
step = ...
steps :: Parser (Step, Step)
steps = (,) <$> mapOptName (addPrefix "step1") step
<*> mapOptName (addPrefix "step2") step
steps accepts arguments like --step1-x --step2-x if step accepts -x. Ideally the prefix could be left out when there is no conflict, but I think BindP gets in the way of defining a renameOptNames :: ([OptName] -> [OptName]) -> Parser a -> Parser a that sees all OptName at once.
uu-options supports +blah -blah delimiters. See section 5.2 of their techreport
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the parser representation around OptP, MultP, AltP, and BindP, then examine how OptName values are collected during parser combination. Compare the requested behavior with the uu-options delimiter approach and determine how overlapping flags should be reported or renamed. Done means combined parsers provide useful help for conflicts without requiring prefixes when no conflict exists.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- haskell
- Domain
- cli
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100