module FreeC.Application.Options.Parser ( parseArgs, getAndParseArgs ) where
import System.Console.GetOpt
import System.Environment ( getArgs )
import FreeC.Application.Options
import FreeC.Application.Options.Descriptors
import FreeC.IR.SrcSpan
import FreeC.Monad.Reporter
parseArgs :: Options
-> [String]
-> Reporter Options
parseArgs defaultOptions args
| null errors = do
let opts = foldr ($) defaultOptions optSetters
return opts { optInputFiles = nonOpts }
| otherwise = do
mapM_ (report . Message NoSrcSpan Error) errors
reportFatal
$ Message NoSrcSpan Error ("Failed to parse command line arguments.\n"
++ "Use '--help' for usage information.")
where
optSetters :: [Options -> Options]
nonOpts :: [String]
errors :: [String]
(optSetters, nonOpts, errors) = getOpt Permute optionDescriptors args
getAndParseArgs :: Options -> ReporterIO Options
getAndParseArgs defaultOpts = do
args <- lift getArgs
hoist $ parseArgs defaultOpts args