2013-11-24 48 views
6

我正在使用optparse-applicative版本0.7.0.2。optparse-applicative:顯示對不帶參數調用的程序的幫助

我想寫一個解析器,需要一些強制性的選擇,但是,當不使用任何選項調用它表明使用和幫助,而不是僅僅使用(也就是說,我想不帶任何選項調用的行爲作爲調用--help)。

我無法弄清楚如何做到這一點,even if the documentation says it is possible

在這個例子中打招呼選項是必需的(因爲它不具有 默認值),所以運行程序沒有任何參數將 顯示幫助文本

是否有這樣的工作示例?主文檔中的一個不爲我工作(只打印使用。)

回答

3

目前,它看起來像要做到這一點,從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用一小塊,檢查如果參數是空的。如果是,它會顯示解析器幫助。

+1

這可能提交已添加一個更簡單的方式來做到以上:https://github.com/pcapriotti/optparse-applicative/commit/bab98fe8ee95635a0befca6ad9365be7d31b0541 – ntc2

2

如果你只是要打印所有錯誤--help輸出, 包括程序不帶參數運行時,然後用電話代替 呼叫execParsershowHelpOnErrorExecParser, 通過

-- | 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    
-- @[email protected]                 
showHelpOnErrorExecParser :: ParserInfo a -> IO a 
showHelpOnErrorExecParser = customExecParser (prefs showHelpOnError) 
定義

基於comment已接受答案中的關聯問題。

3

振興一個老話題,但我已經爲此添加了showHelpOnEmpty pref,所以現在很簡單。鑑於解析器p :: ParserInfo a

run :: IO a 
run = customExecParser (prefs showHelpOnEmpty) p 
相關問題