kmonad-0.4.1: src/KMonad/Args/Cmd.hs
{-|
Module : KMonad.Args.Cmd
Description : Parse command-line options into a 'Cmd' for KMonad to execute
Copyright : (c) David Janssen, 2019
License : MIT
Maintainer : janssen.dhj@gmail.com
Stability : experimental
Portability : non-portable (MPTC with FD, FFI to Linux-only c-code)
-}
module KMonad.Args.Cmd
( Cmd(..)
, HasCmd(..)
, getCmd
)
where
import KMonad.Prelude
import Options.Applicative
--------------------------------------------------------------------------------
-- $cmd
--
-- The different things KMonad can be instructed to do.
-- | Record describing the instruction to KMonad
data Cmd = Cmd
{ _cfgFile :: FilePath -- ^ Which file to read the config from
, _dryRun :: Bool -- ^ Flag to indicate we are only test-parsing
, _logLvl :: LogLevel -- ^ Level of logging to use
}
deriving Show
makeClassy ''Cmd
-- | Parse 'Cmd' from the evocation of this program
getCmd :: IO Cmd
getCmd = customExecParser (prefs showHelpOnEmpty) $ info (cmdP <**> helper)
( fullDesc
<> progDesc "Start KMonad"
<> header "kmonad - an onion of buttons."
)
--------------------------------------------------------------------------------
-- $prs
--
-- The different command-line parsers
-- | Parse the full command
cmdP :: Parser Cmd
cmdP = Cmd <$> fileP <*> dryrunP <*> levelP
-- | Parse a filename that points us at the config-file
fileP :: Parser FilePath
fileP = strArgument
( metavar "FILE"
<> help "The configuration file")
-- | Parse a flag that allows us to switch to parse-only mode
dryrunP :: Parser Bool
dryrunP = switch
( long "dry-run"
<> short 'd'
<> help "If used, do not start KMonad, only try parsing the config file"
)
-- | Parse the log-level as either a level option or a verbose flag
levelP :: Parser LogLevel
levelP = option f
( long "log-level"
<> short 'l'
<> metavar "Log level"
<> value LevelWarn
<> help "How much info to print out (debug, info, warn, error)" )
where
f = maybeReader $ flip lookup [ ("debug", LevelDebug), ("warn", LevelWarn)
, ("info", LevelInfo), ("error", LevelError) ]