12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- 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)
|