{-# LANGUAGE TemplateHaskell #-} module SimpleOptions ( module SimpleOptions , module Options.Applicative ) where import Control.Monad.Trans.Writer import Data.Version (showVersion) import Development.GitRev (gitDirty, gitHash) import Language.Haskell.TH.Syntax (lift) import Options.Applicative simpleVersion version = [|concat [ "Version " , $(lift $ showVersion version) , ", Git revision " , $gitHash , if $gitDirty then " (dirty)" else "" ] |] simpleOptions :: String -- ^ version string -> String -- ^ header -> String -- ^ program description -> Parser a -- ^ global settings -> Writer (Mod CommandFields b) () -- ^ commands (use 'addCommand') -> IO (a, b) simpleOptions versionString h pd globalParser commandParser = execParser $ info (helpOption <*> versionOption <*> config) desc where desc = fullDesc <> header h <> progDesc pd helpOption = abortOption ShowHelpText $ long "help" <> help "Show this help text" versionOption = infoOption versionString (long "version" <> help "Show version") config = (,) <$> globalParser <*> subparser (execWriter commandParser) addCommand :: String -- ^ command string -> String -- ^ title of command -> (a -> b) -- ^ constructor to wrap up command in common data type -> Parser a -- ^ command parser -> Writer (Mod CommandFields b) () addCommand cmd title constr inner = tell $ command cmd (info (constr <$> inner) (progDesc title))