{-# LANGUAGE DoAndIfThenElse #-}
{-# LANGUAGE OverloadedStrings #-}
module Options where
import Control.Monad
import Control.Monad.Trans
import qualified Data.Text as T
import System.Console.GetOpt
import System.Environment
import System.Exit (exitSuccess, exitFailure)
import IO
setOpt :: T.Text -> String -> ArgDescr (MakePackage ())
setOpt o = ReqArg (setOption o . T.pack)
options :: [OptDescr (MakePackage ())]
options = [ Option "h" ["help"] (NoArg $ help [])
"display this help text"
, Option "P" ["package"] (setOpt "package" "string")
"package name"
, Option "d" ["dir"] (setOpt "directory" "string")
"directory to initialize in (default = package name)"
, Option "A" ["author"] (setOpt "defaults.author" "string")
"package author"
, Option "E" ["email"] (setOpt "defaults.email" "string")
"package author email address"
, Option "D" ["description"] (setOpt "description" "string")
"package description"
, Option "L" ["license"] (setOpt "defaults.license" "string")
"license name"
, Option "M" ["modules"] (setOpt "modules" "string")
"exposed modules"
, Option "H" ["categories"] (setOpt "categories" "string")
"hackage categories"
, Option "G" ["git"] (NoArg $ setOption "git.enable" "true")
"enable git"
, Option "g" ["no-git"] (NoArg $ setOption "git.enable" "false")
"disable git"
, Option "C" ["commit"] (NoArg $ setOption "git.do-commit" "true")
"run git commit"
, Option "c" ["no-commit"] (NoArg $ setOption "git.do-commit" "false")
"don't run git commit"
, Option "M" ["commit-message"] (setOpt "git.initial-commit-message"
"string")
"commit message to use"
, Option "G" ["github"] (NoArg $ setOption "github.enable" "true")
"enable github integration"
, Option "g" ["no-github"] (NoArg $ setOption "github.enable" "false")
"disable github integration"
, Option "U" ["username"] (setOpt "github.username" "string")
"github username"
, Option "R" ["repository"] (setOpt "github.repository" "string")
"github repository to create"
, Option "T" ["timeout"] (setOpt "github.timeout" "int")
"timeout for github interactions in seconds"
, Option "K" ["clone"] (NoArg $ setOption "clone" "true")
"clone existing repository "
, Option "k" ["no-clone"] (NoArg $ setOption "clone" "false")
"don't clone existing repository "
, Option "O" ["oauth"] (setOpt "github.auth.oauth" "string")
"github oauth token"
, Option "P" ["password"] (setOpt "github.auth.password" "string")
"github password"
]
help :: MonadIO m => [String] -> m a
help errors = liftIO $
do forM_ errors putStrLn
putStrLn $ usageInfo "make-package [package-name] [options]" options
if null errors
then exitSuccess
else exitFailure
handleArgs :: MakePackage ()
handleArgs =
do args <- liftIO $ getArgs
let (opts, _, errs) = getOpt (ReturnInOrder (setOption "package" . T.pack))
options
args
unless (null errs) $ help errs
sequence_ opts