Opts.hs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. module Potrero.Opts
  2. ( Config(..)
  3. , Mode(..)
  4. , getConfig
  5. , usage
  6. , version
  7. ) where
  8. import qualified System.Console.GetOpt as Opt
  9. data Mode
  10. = ShowHelp
  11. | ShowVersion
  12. | REPL
  13. deriving (Eq, Show)
  14. data Config = Config
  15. { configFiles :: [FilePath]
  16. , configShowRolls :: Bool
  17. , configMode :: Mode
  18. } deriving (Eq, Show)
  19. defaultConfig :: Config
  20. defaultConfig = Config
  21. { configFiles = []
  22. , configShowRolls = False
  23. , configMode = REPL
  24. }
  25. opts :: [Opt.OptDescr (Config -> Config)]
  26. opts =
  27. [ Opt.Option ['s'] ["show-rolls"]
  28. (Opt.NoArg (\ conf -> conf { configShowRolls = True }))
  29. "show the exact roll results"
  30. , Opt.Option ['h'] ["help"]
  31. (Opt.NoArg (\ conf -> conf { configMode = ShowHelp }))
  32. "show this help text"
  33. , Opt.Option ['v'] ["version"]
  34. (Opt.NoArg (\ conf -> conf { configMode = ShowVersion }))
  35. "show the version"
  36. ]
  37. usage :: String
  38. usage = Opt.usageInfo "potrero" opts
  39. version :: String
  40. version = "potrero, version 0.1"
  41. getConfig :: [String] -> Either String Config
  42. getConfig args =
  43. let (fs, files, errors) = Opt.getOpt Opt.Permute opts args
  44. conf = foldr ($) defaultConfig fs
  45. in case errors of
  46. [] -> pure conf { configFiles = files }
  47. _ -> Left (unlines errors)