我正在使用optparse-applicative
版本 0.7.0.2。
我想编写一个带有一些强制选项的解析器,但是当没有选项调用它时,它会同时显示用法和帮助,而不仅仅是用法(也就是说,我希望没有选项的调用表现得像使用 的调用--help
)。
即使文档说有可能,我也不知道该怎么做:
此示例中的 hello 选项是必需的(因为它没有默认值),因此不带任何参数运行程序将显示帮助文本
有一个可行的例子吗?主文档中的那个对我不起作用(它只打印使用情况。)
我正在使用optparse-applicative
版本 0.7.0.2。
我想编写一个带有一些强制选项的解析器,但是当没有选项调用它时,它会同时显示用法和帮助,而不仅仅是用法(也就是说,我希望没有选项的调用表现得像使用 的调用--help
)。
即使文档说有可能,我也不知道该怎么做:
此示例中的 hello 选项是必需的(因为它没有默认值),因此不带任何参数运行程序将显示帮助文本
有一个可行的例子吗?主文档中的那个对我不起作用(它只打印使用情况。)
恢复一个老话题,但我已经showHelpOnEmpty
为此添加了首选项,所以现在很简单。给定一个解析器p :: ParserInfo a
run :: IO a
run = customExecParser (prefs showHelpOnEmpty) p
目前,这样做的唯一方法似乎是customExecParser
从Options.Applicative.Extra 模块创建您自己的版本。有一个未解决的问题可以使这更简单。
像这样的东西应该非常接近你正在寻找的东西:
import Options.Applicative
import Options.Applicative.Help as AH
import Options.Applicative.Types as AT
import System.Environment (getArgs, getProgName)
import System.Exit (exitWith, ExitCode(..))
import System.IO (hPutStr, stderr)
execParserWithHelp :: ParserPrefs -> ParserInfo a -> IO a
execParserWithHelp pprefs pinfo = do
args <- getArgs
case execParserPure pprefs pinfo args of
Right a -> return a
Left failure -> do
progn <- getProgName
msg <- AT.errMessage failure progn
let extra = if null args
then AH.parserHelpText pprefs pinfo
else ""
let c = errExitCode failure
case c of
ExitSuccess -> putStr (msg ++ extra)
_ -> hPutStr stderr (msg ++ extra)
exitWith c
main :: IO ()
main = execParserWithHelp (prefs idm) opts >>= run
opts :: ParserInfo Command
opts = info (commands <**> helper) idm
run :: Command -> IO ()
run = ...
这基本上只是customExecParser
一个检查参数是否为空的小块。如果是,它会显示解析器帮助。
如果您只想打印所有错误
的--help
输出,包括程序在没有参数的情况下运行时,则将调用替换为调用,定义为execParser
showHelpOnErrorExecParser
-- | A version of 'execParser' which shows full help on error.
--
-- The regular 'execParser' only prints usage on error, which doesn't
-- include the options, subcommands, or mention of the help switch
-- @--help@.
showHelpOnErrorExecParser :: ParserInfo a -> IO a
showHelpOnErrorExecParser = customExecParser (prefs showHelpOnError)
基于对已接受答案中链接的问题的评论。