module Options
( Opts(..)
, execParser
, prefs
, showHelpOnEmpty
, optsParser
, optsParserInfo ) where
import Options.Applicative
( (<**>),
auto,
fullDesc,
header,
help,
info,
long,
metavar,
option,
strOption,
prefs,
progDesc,
short,
showHelpOnEmpty,
value,
execParser,
Parser,
ParserInfo,
infoOption,
hidden )
import Options.Applicative.Extra ( helperWith )
import Version ( versionStr, progName )
import Data.Kind (Type)
data Opts = Opts -- ^ Custom data record for storing 'Options.Applicative.Parser' values
{ optPort :: Integer -- ^ MPD port to connect.
, optHost :: String -- ^ MPD host address to connect.
, optPass :: String -- ^ Plain text password to connect to MPD.
, optVersion :: Type -> Type -- ^ Print program version.
}
optsParser :: Parser Opts
optsParser
= Opts
<$> portOptParser
<*> hostOptParser
<*> passOptParser
<*> versionOptParse
portOptParser :: Parser Integer
portOptParser
= option auto
$ long "port"
<> short 'p'
<> metavar "PORTNUM"
<> value 6600
<> help "Port number"
hostOptParser :: Parser String
hostOptParser
= strOption
$ metavar "ADDRESS"
<> long "host"
<> short 'h'
<> value "localhost"
<> help "Host address"
passOptParser :: Parser String
passOptParser
= option auto
$ metavar "PASSWORD"
<> long "password"
<> short 'P'
<> value ""
<> help "Password for connecting (will be sent as plain text)"
versionOptParse :: Parser (a -> a)
versionOptParse =
infoOption versionStr
$ long "version"
<> short 'V'
<> help "Display the version number"
optsParserInfo :: ParserInfo Opts
optsParserInfo = info (optsParser <**> helper')
$ fullDesc
<> progDesc "Print currently playing song information as JSON"
<> header (progName ++ " - " ++ "Current MPD song information as JSON")
helper' :: Parser (a -> a)
helper' = helperWith
$ long "help"
-- <> help "Show this help text"
<> hidden -- don't show in help messages