summaryrefslogtreecommitdiff
path: root/Biz/Cli.hs
blob: b3c7583b962e7f6c23efcca69075e853d5f3620f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Biz.Cli
  ( Plan (..),
    main,
    Docopt.Docopt (..),
    Docopt.Arguments,
    Docopt.argument,
    Docopt.docopt,
    Docopt.getAllArgs,
    Docopt.getArg,
    Docopt.getArgWithDefault,
    Docopt.longOption,
    Docopt.shortOption,
    Docopt.command,
    has,
  )
where

import Alpha
import qualified Biz.Test as Test
import qualified System.Console.Docopt as Docopt
import qualified System.Environment as Environment

data Plan cfg = Plan
  { help :: Docopt.Docopt,
    move :: Docopt.Arguments -> IO (),
    test :: Test.Tree,
    tidy :: cfg -> IO ()
  }

main :: Plan cfg -> IO ()
main Plan {..} =
  Environment.getArgs
    +> Docopt.parseArgsOrExit help
    +> \args ->
      if args `has` Docopt.command "test"
        then Test.run test
        else
          if args `has` Docopt.longOption "help" || args `has` Docopt.shortOption 'h'
            then Docopt.exitWithUsage help
            else move args

has :: Docopt.Arguments -> Docopt.Option -> Bool
has = Docopt.isPresent