optparse-applicative-0.19.0.0: tests/Examples/ParserGroup/Basic.hs
{-# LANGUAGE NamedFieldPuns #-}
module Examples.ParserGroup.Basic (opts, main) where
import Data.Semigroup ((<>))
import Options.Applicative
data LogGroup = LogGroup
{ logPath :: Maybe String,
logVerbosity :: Maybe Int
}
deriving (Show)
data SystemGroup = SystemGroup
{ poll :: Bool,
timeout :: Int
}
deriving (Show)
data Sample = Sample
{ hello :: String,
logGroup :: LogGroup,
quiet :: Bool,
systemGroup :: SystemGroup,
verbosity :: Int,
cmd :: String
}
deriving (Show)
sample :: Parser Sample
sample =
Sample
<$> parseHello
<*> parseLogGroup
<*> parseQuiet
<*> parseSystemGroup
<*> parseVerbosity
<*> parseCmd
where
parseHello =
strOption
( long "hello"
<> metavar "TARGET"
<> help "Target for the greeting"
)
parseLogGroup =
parserOptionGroup "Logging" $
LogGroup
<$> optional
( strOption
( long "file-log-path"
<> metavar "PATH"
<> help "Log file path"
)
)
<*> optional
( option
auto
( long "file-log-verbosity"
<> metavar "INT"
<> help "File log verbosity"
)
)
parseQuiet =
switch
( long "quiet"
<> short 'q'
<> help "Whether to be quiet"
)
parseSystemGroup =
parserOptionGroup "System Options" $
SystemGroup
<$> switch
( long "poll"
<> help "Whether to poll"
)
<*> ( option
auto
( long "timeout"
<> metavar "INT"
<> help "Whether to time out"
)
)
parseVerbosity =
option
auto
( long "verbosity"
<> short 'v'
<> help "Console verbosity"
)
parseCmd = argument str (metavar "Command")
opts :: ParserInfo Sample
opts =
info
(sample <**> helper)
( fullDesc
<> progDesc "Shows parser groups"
<> header "parser_group.basic - a test for optparse-applicative"
)
main :: IO ()
main = do
r <- customExecParser (prefs helpShowGlobals) opts
print r