module BNFC.Options where import BNFC.Prelude import BNFC.Options.Commands import BNFC.Options.GlobalOptions import BNFC.Options.InfoOptions import Options.Applicative import Options.Applicative.Help.Pretty (vcat, text) import System.Environment (getArgs) data Options = Options { globalOptions :: GlobalOptions , command :: Command } programOptions :: Parser Options programOptions = Options <$> globalOptionsParser <*> commandsParser getOptInput :: Options -> FilePath getOptInput = optInput . globalOptions -- * Option parsing and handling options :: IO Options options = options' =<< getArgs options' :: [String] -> IO Options options' args = execParser' args $ info (helper <*> versionOption <*> numericVersionOption <*> licenseOption <*> programOptions) (header "The BNF Converter" <> footerDoc (Just foot)) where foot = vcat $ map text $ concat [ [ "" ] ] type Target = Maybe FilePath -- * Patch to optparse-applicative -- | Like 'execParser', but parse given argument list rather than those from 'getArgs'. execParser' :: [String] -> ParserInfo a -> IO a execParser' = customExecParser' defaultPrefs -- | Run a program description with custom preferences. customExecParser' :: ParserPrefs -> [String] -> ParserInfo a -> IO a customExecParser' pprefs args pinfo = handleParseResult $ execParserPure pprefs pinfo args