optparse-applicative:显示没有参数调用的程序的帮助

时间:2013-11-24 10:17:32

标签: haskell command-line-arguments applicative

我正在使用optparse-applicative版本0.7.0.2。

我想编写一个带有一些强制选项的解析器,但是当没有选项调用时,它会显示两个用法和帮助,而不仅仅是用法(也就是说,我希望调用没有选项可以作为--help)的调用。

我无法弄清楚如何执行此操作,even if the documentation says it is possible

  

此示例中的hello选项是必需的(因为它没有   默认值),所以运行没有任何参数的程序会   显示帮助文本

这是否有一个有效的例子?主文档中的那个对我不起作用(仅打印用法。)

3 个答案:

答案 0 :(得分:5)

恢复一个旧主题,但我为此添加了showHelpOnEmpty pref,所以它现在很简单。给定解析器p :: ParserInfo a

run :: IO a
run = customExecParser (prefs showHelpOnEmpty) p

答案 1 :(得分:4)

目前看来,执行此操作的唯一方法是从Options.Applicative.Extra module创建自己的customExecParser版本。有an open issue使这更简单。

这样的事情应该与你正在寻找的东西非常接近:

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,带有一个小块,用于检查args是否为空。如果是,则显示解析器帮助。

答案 2 :(得分:2)

如果您只想在所有错误上打印--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)

基于已接受答案中链接的comment问题。