packages feed

vimus-0.2.1: src/Option.hs

module Option (getOptions) where

import           Paths_vimus (version)
import           Data.Version (showVersion)

import           Data.Maybe
import           Data.List
import           Control.Monad
import           Text.Printf (printf)
import           System.Environment (getArgs, getProgName)
import           System.Exit (exitSuccess, exitFailure)
import           System.IO (hPutStr, stderr)
import           System.Console.GetOpt

data Option = Help
            | Version
            | IgnoreVimusrc
            | OptionHost String
            | OptionPort String
            deriving (Show, Eq)

hostHelp :: String
hostHelp = intercalate "\n"
  [ "The host to connect to; if not given, the value"
  , "of the environment variable MPD_HOST is checked"
  , "before defaulting to localhost.  To use a"
  , "password, provide a value of the form"
  , "`password@host'."
  ]

portHelp :: String
portHelp = intercalate "\n"
  [ "The port to connect to; if not given, the value"
  , "of the environment variable MPD_PORT is checked"
  , "before defaulting to 6600."
  ]

options :: [OptDescr Option]
options = [
    Option []     ["help"]            (NoArg  Help             ) "Display this help and exit."
  , Option []     ["version"]         (NoArg  Version          ) "Display version and exit."
  , Option ['h']  ["host"]            (ReqArg OptionHost "HOST") hostHelp
  , Option ['p']  ["port"]            (ReqArg OptionPort "PORT") portHelp
  , Option []     ["ignore-vimusrc"]  (NoArg  IgnoreVimusrc    ) "Do not source ~/.vimusrc on startup."
  ]


getOptions :: IO (Maybe String, Maybe String, Bool)
getOptions = do

  (opts, args, errors) <- getOpt Permute options `liftM` getArgs

  when (Help `elem` opts) $ do
    progName <- getProgName
    putStr $ usageInfo (printf "Usage: %s [options]\n\nOPTIONS" progName) options
    exitSuccess

  when (Version `elem` opts) $ do
    progName <- getProgName
    putStrLn (progName ++ " " ++ showVersion version)
    exitSuccess

  unless (null errors) $
    exitTryHelp $ head errors

  unless (null args) $
    exitTryHelp $ printf "unexpected argument `%s'\n" $ head args

  let port = listToMaybe . reverse $ [ option | OptionPort option <- opts ]
  let host = listToMaybe . reverse $ [ option | OptionHost option <- opts ]
  let ignoreVimusrc = IgnoreVimusrc `elem` opts

  return (host, port, ignoreVimusrc)


exitTryHelp :: String -> IO a
exitTryHelp message = do
  progName <- getProgName
  hPutStr stderr $ printf "%s: %sTry `%s --help' for more information.\n" progName message progName
  exitFailure