module Options.Applicative.Extra ( -- * Extra parser utilities -- -- | This module contains high-level functions to run parsers. helper, execParser, execParserPure, usage, ParserFailure(..), ) where import Data.Lens.Common import Options.Applicative.Common import Options.Applicative.Builder import Options.Applicative.Help import Options.Applicative.Utils import Options.Applicative.Types import System.Environment import System.Exit import System.IO -- | A hidden \"helper\" option which always fails. helper :: Parser (a -> a) helper = nullOption ( long "help" & short 'h' & help "Show this help text" & value id & hide ) -- | Result after a parse error. data ParserFailure = ParserFailure { errMessage :: String -> String -- ^ Function which takes the program name -- as input and returns an error message , errExitCode :: ExitCode -- ^ Exit code to use for this error } -- | Run a program description. -- -- Parse command line arguments. Display help text and exit if any parse error -- occurs. execParser :: ParserInfo a -> IO a execParser pinfo = do args <- getArgs case execParserPure pinfo args of Right a -> return a Left failure -> do progn <- getProgName hPutStr stderr (errMessage failure progn) exitWith (errExitCode failure) -- | A pure version 'execParser'. execParserPure :: ParserInfo a -- ^ Description of the program to run -> [String] -- ^ Program arguments -> Either ParserFailure a execParserPure pinfo args = case runParser parser args of Just (a, []) -> Right a _ -> Left ParserFailure { errMessage = \progn -> parserHelpText (add_usage progn pinfo) , errExitCode = ExitFailure (pinfo^.infoFailureCode) } where parser = pinfo^.infoParser add_usage progn = modL infoHeader $ \h -> vcat [h, usage parser progn] -- | Generate option summary. usage :: Parser a -> String -> String usage p progn = foldr (<+>) "" [ "Usage:" , progn , briefDesc p ]