module Options (getOpts) where import Control.Monad (when) import qualified System.Console.GetOpt as Opt import qualified System.Directory as Sys import qualified System.Environment as Sys import qualified System.Exit as Sys import qualified Bunyan data Options = Options { optShowVersion :: Bool , optShowHelp :: Bool , optEditorCmd :: Maybe String , optRepoPath :: FilePath } deriving (Eq, Show) options :: [Opt.OptDescr (Options -> Options)] options = [ Opt.Option ['v'] ["version"] (Opt.NoArg (\ o -> o { optShowVersion = True })) "Show version number" , Opt.Option ['h'] ["help"] (Opt.NoArg (\ o -> o { optShowHelp = True })) "Show this help screen" , Opt.Option ['e'] ["editor"] (Opt.ReqArg (\ e o -> o { optEditorCmd = Just e }) "CMD") "desired editor command (defaults to $EDITOR)" , Opt.Option ['r'] ["repository"] (Opt.ReqArg (\ p o -> o { optRepoPath = p }) "PATH") "git repository location (defaults to $CWD)" ] usageInfo :: String usageInfo = Opt.usageInfo header options where header = "Usage: bunyan [OPTIONS]..." getOpts :: IO Bunyan.Config getOpts = do args <- Sys.getArgs defaultEditor <- Sys.lookupEnv "EDITOR" defaultPath <- Sys.getCurrentDirectory let defOpts = Options { optShowVersion = False , optShowHelp = False , optEditorCmd = defaultEditor , optRepoPath = defaultPath } case Opt.getOpt Opt.Permute options args of (o, [], []) -> do let opts = foldl (flip id) defOpts o when (optShowVersion opts) $ do putStrLn "bunyan, version 0.1.0.0" Sys.exitSuccess when (optShowHelp opts) $ do putStrLn usageInfo Sys.exitSuccess editor <- case optEditorCmd opts of Just e -> return e Nothing -> Sys.die "No $EDITOR set and no editor command supplied!" return $ Bunyan.Config { Bunyan.cfgEditorCommand = editor , Bunyan.cfgGitRepo = optRepoPath opts } (_, _, errs) -> do Sys.die (concat errs ++ usageInfo)