kmonad-0.4.1: src/KMonad/Args.hs
{-|
Module : KMonad.Args
Description : How to parse arguments and config files into an AppCfg
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
( run )
where
import KMonad.Prelude
import KMonad.App
import KMonad.Args.Cmd
import KMonad.Args.Joiner
import KMonad.Args.Parser
import KMonad.Args.Types
--------------------------------------------------------------------------------
--
-- | Run KMonad
run :: IO ()
run = getCmd >>= runCmd
-- | Execute the provided 'Cmd'
--
-- 1. Construct the log-func
-- 2. Parse the config-file
-- 3. Maybe start KMonad
runCmd :: Cmd -> IO ()
runCmd c = do
o <- logOptionsHandle stdout False <&> setLogMinLevel (c^.logLvl)
withLogFunc o $ \f -> runRIO f $ do
cfg <- loadConfig $ c^.cfgFile
unless (c^.dryRun) $ startApp cfg
-- | Parse a configuration file into a 'AppCfg' record
loadConfig :: HasLogFunc e => FilePath -> RIO e AppCfg
loadConfig pth = do
tks <- loadTokens pth -- This can throw a PErrors
cgt <- joinConfigIO tks -- This can throw a JoinError
-- Try loading the sink and src
lf <- view logFuncL
snk <- liftIO . _snk cgt $ lf
src <- liftIO . _src cgt $ lf
-- Assemble the AppCfg record
pure $ AppCfg
{ _keySinkDev = snk
, _keySourceDev = src
, _keymapCfg = _km cgt
, _firstLayer = _fstL cgt
, _fallThrough = _flt cgt
, _allowCmd = _allow cgt
}