Supporting positional arguments

This commit is contained in:
Zoe Roux
2021-03-11 16:41:23 +01:00
parent e0de414346
commit 6f5d26ff39
+9 -5
View File
@@ -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)