Options.hs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. module Options (getOpts) where
  2. import Control.Monad (when)
  3. import qualified System.Console.GetOpt as Opt
  4. import qualified System.Directory as Sys
  5. import qualified System.Environment as Sys
  6. import qualified System.Exit as Sys
  7. import qualified Bunyan
  8. data Options = Options
  9. { optShowVersion :: Bool
  10. , optShowHelp :: Bool
  11. , optEditorCmd :: Maybe String
  12. , optRepoPath :: FilePath
  13. } deriving (Eq, Show)
  14. options :: [Opt.OptDescr (Options -> Options)]
  15. options =
  16. [ Opt.Option ['v'] ["version"]
  17. (Opt.NoArg (\ o -> o { optShowVersion = True }))
  18. "Show version number"
  19. , Opt.Option ['h'] ["help"]
  20. (Opt.NoArg (\ o -> o { optShowHelp = True }))
  21. "Show this help screen"
  22. , Opt.Option ['e'] ["editor"]
  23. (Opt.ReqArg (\ e o -> o { optEditorCmd = Just e }) "CMD")
  24. "desired editor command (defaults to $EDITOR)"
  25. , Opt.Option ['r'] ["repository"]
  26. (Opt.ReqArg (\ p o -> o { optRepoPath = p }) "PATH")
  27. "git repository location (defaults to $CWD)"
  28. ]
  29. usageInfo :: String
  30. usageInfo = Opt.usageInfo header options
  31. where header = "Usage: bunyan [OPTIONS]..."
  32. getOpts :: IO Bunyan.Config
  33. getOpts = do
  34. args <- Sys.getArgs
  35. defaultEditor <- Sys.lookupEnv "EDITOR"
  36. defaultPath <- Sys.getCurrentDirectory
  37. let defOpts = Options
  38. { optShowVersion = False
  39. , optShowHelp = False
  40. , optEditorCmd = defaultEditor
  41. , optRepoPath = defaultPath
  42. }
  43. case Opt.getOpt Opt.Permute options args of
  44. (o, [], []) -> do
  45. let opts = foldl (flip id) defOpts o
  46. when (optShowVersion opts) $ do
  47. putStrLn "bunyan, version 0.1.0.0"
  48. Sys.exitSuccess
  49. when (optShowHelp opts) $ do
  50. putStrLn usageInfo
  51. Sys.exitSuccess
  52. editor <- case optEditorCmd opts of
  53. Just e -> return e
  54. Nothing ->
  55. Sys.die "No $EDITOR set and no editor command supplied!"
  56. return $ Bunyan.Config
  57. { Bunyan.cfgEditorCommand = editor
  58. , Bunyan.cfgGitRepo = optRepoPath opts
  59. }
  60. (_, _, errs) -> do
  61. Sys.die (concat errs ++ usageInfo)