2013-11-24 6 views
6

Sto usando optparse-applicative versione 0.7.0.2.optparse-applicative: visualizzazione della guida per i programmi richiamati senza argomenti

Voglio scrivere un parser che prende alcune opzioni obbligatorie, ma che quando invocato con Senza opzioni mostra sia utilizzo e aiutare, piuttosto che semplicemente l'uso (cioè, voglio l'invocazione senza opzioni a comportarsi come invocazione con --help).

io non riesco a capire come farlo, even if the documentation says it is possible:

L'opzione ciao in questo esempio è obbligatoria (dal momento che non ha un valore di default), in modo da eseguire il programma senza alcun argomento visualizza un testo di aiuto

Esiste un esempio funzionante di questo? Quello nella documentazione principale non funziona per me (stampa solo l'utilizzo.)

risposta

3

Attualmente, sembra che l'unico modo per farlo sia quello di creare la propria versione di da Options.Applicative.Extra module. C'è an open issue per rendere più semplice questo.

Qualcosa del genere dovrebbe essere abbastanza vicino a quello che stai cercando:

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

Questo è fondamentalmente solo customExecParser con un piccolo blocco che controlla se i args sono vuote. Se lo sono, visualizza l'aiuto del parser.

+1

Questa commettere potrebbe aver aggiunto un modo più semplice per ottenere il risultato: https://github.com/pcapriotti/optparse-applicative/commit/bab98fe8ee95635a0befca6ad9365be7d31b0541 – ntc2

2

Se si desidera solo per stampare l'--help uscita sul tutti errori, compreso quando il programma viene eseguito senza argomenti, quindi sostituire chiamate a execParser con le chiamate a showHelpOnErrorExecParser, definito da

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

in base a comment sull'emissione collegata nella risposta accettata.

3

Ripristino di un argomento precedente, ma per questo ho aggiunto il prefisso showHelpOnEmpty, quindi è ora semplice. Dato un parser p :: ParserInfo a

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