module Args (args, Args(..), Uniform(..), Sort(..), KeyPlace(..), TitlePlace(..)) where
import Options.Applicative
import Data.Semigroup ((<>))
data Uniform = None | Time | Memory | Both deriving (Eq)
data Sort = Size | StdDev | Name
data KeyPlace = KeyInline | KeyFile FilePath
data TitlePlace = TitleInline | TitleFile FilePath
data Args = Args
{ uniformity :: Uniform
, sorting :: Sort
, keyPlace :: KeyPlace
, titlePlace :: TitlePlace
, reversing :: Bool
, tracePercent :: Double
, nBands :: Int
, patterned :: Bool
, files :: [String]
}
argParser :: Parser Args
argParser = Args
<$> option parseUniform
( long "uniform-scale"
<> help "Whether to use a uniform scale for all outputs. One of: none (default), time, memory, both."
<> value None
<> metavar "AXES" )
<*> option parseSort
( long "sort"
<> help "How to sort the bands. One of: size (default), stddev, name."
<> value Size
<> metavar "FIELD" )
<*> option parseKey
( long "key"
<> help "Whether to embed the key in the image output. One of: inline (default), FILE.txt. Use - for standard output and ./inline for a file named literally \"inline\"."
<> value KeyInline
<> metavar "KEY" )
<*> option parseTitle
( long "title"
<> help "Whether to embed the title in the image output. One of: inline (default), FILE.txt. Use - for standard output and ./inline for a file named literally \"inline\"."
<> value TitleInline
<> metavar "TITLE" )
<*> switch
( long "reverse"
<> help "Reverse the order of bands." )
<*> option auto
( long "trace"
<> help "Percentage of trace elements to combine."
<> value 1
<> showDefault
<> metavar "PERCENT" )
<*> option auto
( long "bands"
<> help "Maximum number of bands to draw (0 for unlimited)."
<> value 15
<> showDefault
<> metavar "COUNT" )
<*> switch
( long "pattern"
<> help "Use patterns instead of solid colours to fill bands." )
<*> some (argument str
( help "Heap profiles (FILE.hp will be converted to FILE.svg)."
<> metavar "FILES..." ))
parseUniform :: ReadM Uniform
parseUniform = eitherReader $ \s -> case s of
"none" -> Right None
"time" -> Right Time
"memory" -> Right Memory
"both" -> Right Both
_ -> Left "expected one of: none, time, memory, both"
parseSort :: ReadM Sort
parseSort = eitherReader $ \s -> case s of
"size" -> Right Size
"stddev" -> Right StdDev
"name" -> Right Name
_ -> Left "expected one of: size, stddev, name"
parseKey :: ReadM KeyPlace
parseKey = eitherReader $ \s -> case s of
"inline" -> Right KeyInline
"" -> Left "expected one of: inline, FILE.txt"
f -> Right (KeyFile f)
parseTitle :: ReadM TitlePlace
parseTitle = eitherReader $ \s -> case s of
"inline" -> Right TitleInline
"" -> Left "expected one of: inline, FILE.txt"
f -> Right (TitleFile f)
args :: IO Args
args = execParser opts
where
opts = info (argParser <**> helper)
( fullDesc
<> progDesc "Convert heap profile FILES.hp to pretty graphs FILES.svg"
<> header "hp2pretty - generate pretty graphs from heap profiles" )