{-# OPTIONS_HADDOCK hide #-}
module Trace.Hpc.Codecov.Options
(
Options(..)
, defaultOptions
, emptyOptions
, parseOptions
, opt2rpt
, printHelp
, printVersion
, versionString
) where
import Control.Exception (throw)
import Data.Version (showVersion)
import System.Console.GetOpt (ArgDescr (..), ArgOrder (..),
OptDescr (..), getOpt, usageInfo)
import System.Environment (getProgName)
import Paths_hpc_codecov (version)
import Trace.Hpc.Codecov.Error
import Trace.Hpc.Codecov.Report
data Options = Options
{ optTix :: FilePath
, optMixDirs :: [FilePath]
, optSrcDirs :: [FilePath]
, optExcludes :: [String]
, optOutFile :: Maybe FilePath
, optVerbose :: Bool
, optShowVersion :: Bool
, optShowNumeric :: Bool
, optShowHelp :: Bool
} deriving (Eq, Show)
emptyOptions :: Options
emptyOptions = Options
{ optTix = throw NoTixFile
, optMixDirs = []
, optSrcDirs = []
, optExcludes = []
, optOutFile = Nothing
, optVerbose = False
, optShowVersion = False
, optShowNumeric = False
, optShowHelp = False
}
defaultOptions :: Options
defaultOptions = emptyOptions
{ optMixDirs = [".hpc"]
, optSrcDirs = [""]
}
options :: [OptDescr (Options -> Options)]
options =
[ Option ['m'] ["mixdir"]
(ReqArg (\d o -> o {optMixDirs = d : optMixDirs o})
"DIR")
".mix file directory, can repeat\n\
\default is .hpc"
, Option ['s'] ["srcdir"]
(ReqArg (\d o -> o {optSrcDirs = d : optSrcDirs o})
"DIR")
"source directory, can repeat\n\
\default is current directory"
, Option ['x'] ["exclude"]
(ReqArg (\m o -> o {optExcludes = m : optExcludes o})
"MODULE")
"module name to exclude, can repeat"
, Option ['o'] ["out"]
(ReqArg (\p o -> o {optOutFile = Just p}) "FILE")
"output file\n\
\default is stdout"
, Option ['v'] ["verbose"]
(NoArg (\o -> o {optVerbose = True}))
"show verbose output"
, Option [] ["version"]
(NoArg (\o -> o {optShowVersion = True}))
"show versoin and exit"
, Option [] ["numeric-version"]
(NoArg (\o -> o {optShowNumeric = True}))
"show numeric version and exit"
, Option ['h'] ["help"]
(NoArg (\o -> o {optShowHelp = True}))
"show this help"
]
parseOptions :: [String]
-> Either [String] Options
parseOptions args =
case getOpt Permute options args of
(flags, rest, []) ->
let opts0 = foldr (.) id flags $ emptyOptions
opts1 = fillDefaultIfNotGiven opts0
in case rest of
[] -> Right opts1
(tix:_) -> Right (opts1 {optTix = tix})
(_, _, errs) -> Left errs
fillDefaultIfNotGiven :: Options -> Options
fillDefaultIfNotGiven opts = opts
{ optMixDirs = fillIf null optMixDirs
, optSrcDirs = fillIf null optSrcDirs
}
where
fillIf test fld =
let orig = fld opts
in if test orig
then fld defaultOptions
else orig
opt2rpt :: Options -> Report
opt2rpt opt = Report
{ reportTix = optTix opt
, reportMixDirs = optMixDirs opt
, reportSrcDirs = optSrcDirs opt
, reportExcludes = optExcludes opt
, reportOutFile = optOutFile opt
, reportVerbose = optVerbose opt
}
printHelp :: IO ()
printHelp = getProgName >>= putStrLn . helpMessage
printVersion :: IO ()
printVersion =
do me <- getProgName
putStrLn (me ++ " version " ++ versionString)
helpMessage :: String
-> String
helpMessage name = usageInfo header options
where
header = "\
\Generate Codecov JSON coverage report from .tix and .mix files\n\
\\n\
\Usage: \n\
\\n\
\ " ++ name ++ " [OPTIONS] TIX_FILE\n\
\\n\
\Options:\n"
versionString :: String
versionString = showVersion version