你的问题比你想象的要复杂得多。当前optparse-applicative
API不应该用于这种情况。所以你可能想要改变你处理CLI参数或切换到另一个CLI解析库的方式。但我会描述实现你的目标最接近的方式。
首先,你需要阅读其他两条SO问题:
1.How to parse Maybe with optparse-applicative
2.Is it possible to have a optparse-applicative option with several parameters?
从第一个问题,你知道如何使用optional
功能解析可选参数。从第二点开始,您将学习解析多个参数的一些问题。所以我会在这里写几种方法来解决这个问题。
1.幼稚和丑陋
可以代表对字符串作为对String
类型和使用这副只是天真show
。这里是代码:
mainParser :: Parser Arguments
mainParser = Arguments
<$> switch (long "someflag" <> help "Some argument flag")
<*> optional (uncurry SubArguments <$>
(option auto $ long "subarguments" <> help "some desc"))
getArguments :: IO Arguments
getArguments = do
(res,()) <- simpleOptions "main example" "" "desc" mainParser empty
return res
main :: IO()
main = getArguments >>= print
下面是导致ghci
:
ghci> :run main --someflag --subarguments "(\"a\",\"b\")"
Arguments True (Just (SubArguments "a" "b"))
2.少天真
从答案,你应该学会如何通过一个字符串内的多个参数的第二个问题。下面是解析代码:
subArgParser :: ReadM SubArguments
subArgParser = do
input <- str
-- no error checking, don't actually do this
let [a,b] = words input
pure $ SubArguments a b
mainParser :: Parser Arguments
mainParser = Arguments
<$> switch (long "someflag" <> help "Some argument flag")
<*> optional (option subArgParser $ long "subarguments" <> help "some desc")
这里是ghci
输出:
ghci> :run main --someflag --subarguments "x yyy"
Arguments True (Just (SubArguments "x" "yyy"))
在第二个解决方案唯一不好的是,错误检查不存在。因此,您可以使用另一个通用解析库,例如megaparsec
,而不仅仅是let [a,b] = words input
。
我问了图书馆的作者。这是不可能的(现在)。看Paolo Capriotti的水管 – Pieter