2013-11-24 6 views
6

Ich benutze optparse-applicative Version 0.7.0.2.optparse-applicative: Anzeige der Hilfe für Programme, die ohne Argumente aufgerufen werden

Ich möchte einen Parser schreiben, die einige obligatorischen Optionen nimmt, aber das, wenn ohne Optionen aufgerufen zeigt es sowohl Nutzung und helfen, im Gegensatz zu nur Nutzung (das heißt, möchte ich den Aufruf ohne Optionen verhalten als der Aufruf mit --help).

Ich kann nicht herausfinden, wie dies zu tun, even if the documentation says it is possible:

Die hallo Option in diesem Beispiel obligatorisch ist (da es keinen Standardwert hat), so das Programm ohne Lauf Argument wird einen Hilfetext anzeigen

Gibt es ein Arbeitsbeispiel dafür? Das in der Hauptdokumentation funktioniert nicht für mich (es druckt nur die Verwendung.)

Antwort

3

Momentan sieht es so aus, als wäre die einzige Möglichkeit, dies zu tun, Ihre eigene Version customExecParser von der Options.Applicative.Extra module zu erstellen. Es gibt an open issue, um dies zu vereinfachen.

So etwas sollte ziemlich nah dran sein, was Sie suchen:

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 = ... 

Diese im Grunde nur customExecParser mit einem kleinen Block ist, dass der args überprüft, ob leer ist. Wenn dies der Fall ist, wird die Parser-Hilfe angezeigt.

+1

Diese haben begehen kann einen einfacheren Weg, um die oben genannten tun hinzugefügt: https://github.com/pcapriotti/optparse-applicative/commit/bab98fe8ee95635a0befca6ad9365be7d31b0541 – ntc2

2

Wenn Sie die --help Ausgabe auf alle Fehler, einschließlich nur drucken möchten, wenn das Programm ohne Argumente ausgeführt wird, dann Anrufe execParser mit Aufrufen an showHelpOnErrorExecParser ersetzen, durch

definiert
-- | 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) 

Basierend auf comment auf Problem in der angenommenen Antwort verknüpft.

3

Wiederbelebung eines alten Themas, aber ich habe die showHelpOnEmpty Pref für dieses hinzugefügt, so dass es jetzt einfach ist. Bei einem Parser p :: ParserInfo a

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