mirror of
https://github.com/zoriya/applicative-getopt.git
synced 2026-05-29 17:32:01 +00:00
Supporting positional arguments
This commit is contained in:
@@ -19,22 +19,26 @@ import GetOpt.Parsers
|
||||
getOpt :: Parser a -> [String] -> Maybe (a, [String])
|
||||
getOpt (DefParser a) args = Just (a, args)
|
||||
getOpt p args = case runParser p args of
|
||||
Just (p1, args1) -> getOpt p1 args1
|
||||
Nothing -> Nothing
|
||||
Just (p1@(OptParser _ _), args1) -> getOpt p1 args1
|
||||
Just (DefParser a, args1) -> Just (a, args1)
|
||||
Nothing -> Nothing
|
||||
|
||||
runParser :: Parser a -> [String] -> Maybe (Parser a, [String])
|
||||
runParser p@(DefParser _) args = Nothing
|
||||
runParser p@(DefParser _) args = Just (p, args)
|
||||
runParser (OptParser opt next) [] = do
|
||||
def <- defaultValue opt
|
||||
return (fmap def next, [])
|
||||
runParser (OptParser opt next) (identifier:args)
|
||||
runParser p@(OptParser opt next) (identifier:args)
|
||||
| optionMatch opt identifier = do
|
||||
(ret, lo) <- getArg opt args
|
||||
return (fmap ret next, lo)
|
||||
| (DefParser _) <- next = do
|
||||
(ret, lo) <- runParser p args
|
||||
return (ret, identifier:lo)
|
||||
| otherwise = do
|
||||
(nextP, newArgs) <- runParser next (identifier:args)
|
||||
return (OptParser opt nextP, newArgs)
|
||||
|
||||
|
||||
where
|
||||
getArg :: Option a -> [String] -> Maybe (a, [String])
|
||||
getArg opt (arg:args)
|
||||
|
||||
Reference in New Issue
Block a user