{-# LANGUAGE TemplateHaskell #-}
module DzenDhall.Arguments where
import Options.Applicative
import Data.Semigroup ((<>))
import Lens.Micro.TH
data Explain
= Explain | DontExplain
deriving (Show, Eq)
data ConfirmPlug
= Confirm | DontConfirm
deriving (Show, Eq)
data StdoutFlag
= ToDzen | ToStdout
deriving (Show, Eq)
data SkipAssertions
= SkipAssertions | DontSkip
deriving (Show, Eq)
data PlugCommand
= PlugCommand { source :: String
, confirm :: ConfirmPlug
}
deriving (Show, Eq)
newtype UnplugCommand
= UnplugCommand String
deriving (Show, Eq)
data ValidateCommand
= ValidateCommand { skipAssertions :: SkipAssertions
}
deriving (Show, Eq)
data Command
= Init
| Plug PlugCommand
| Unplug UnplugCommand
| Validate ValidateCommand
| Version
deriving (Show, Eq)
data Arguments
= Arguments
{ _mbConfigDir :: Maybe String
, _mbDzenBinary :: Maybe String
, _stdoutFlag :: StdoutFlag
, _mbCommand :: Maybe Command
, _explain :: Explain
}
deriving (Show, Eq)
makeLenses ''Arguments
argParser :: Parser Arguments
argParser = Arguments
<$> optional
( strOption
$ long "config-dir"
<> metavar "DIRECTORY"
<> help "Config directory, used to store your config.dhall and some dhall source code. Default value is $XDG_CONFIG_HOME/dzen-dhall/"
)
<*> optional
( strOption
$ long "dzen-binary"
<> metavar "FILE"
<> help "Path to Dzen executable. By default, 'dzen2' binary from $PATH will be used."
)
<*> flag ToDzen ToStdout
( long "stdout"
<> help "Write output to stdout."
)
<*> optional
(
hsubparser
( command "init"
( info
( pure Init )
( progDesc "Write default configuration files to configuration directory." )
)
<> command "plug"
( info
( Plug <$> plugCommandParser )
( progDesc "Install a plugin to the `plugins` directory. Acceptable formats: `name`, `github-username/repository`, a file name or URL." )
)
<> command "unplug"
( info
( Unplug <$> unplugCommandParser )
( progDesc "Remove a plugin from plugins directory." )
)
<> command "validate"
( info
( Validate <$> validateCommandParser )
( progDesc "Validate the configuration without running it." )
)
<> command "version"
( info
( pure Version )
( progDesc "Print version info" )
)
)
)
<*> flag DontExplain Explain
( long "explain"
<> help "Explain error messages in more detail."
)
plugCommandParser :: Parser PlugCommand
plugCommandParser =
PlugCommand <$> argument str (metavar "PLUGIN SOURCE")
<*> flag Confirm DontConfirm
( long "yes"
<> help "Skip manual code review and confirmation."
)
unplugCommandParser :: Parser UnplugCommand
unplugCommandParser =
UnplugCommand <$> argument str (metavar "PLUGIN NAME")
validateCommandParser :: Parser ValidateCommand
validateCommandParser =
ValidateCommand <$> flag SkipAssertions DontSkip
( long "include-assertions"
<> short 'a'
<> help "Validate assertions too (this will result in running executable code)."
)
argumentsParser :: ParserInfo Arguments
argumentsParser = info (argParser <**> helper)
( fullDesc
<> progDesc "Configure dzen2 bars in Dhall language." )