summaryrefslogtreecommitdiff
path: root/src/Main.hs
blob: 5072a64286badab3a44402ef248b04ff993299c8 (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
47
48
49
50
51
52
53
54
55
56
57
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE NamedFieldPuns    #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import           Data.Aeson                    (encode)
import           Data.Aeson.Encode.Pretty      (encodePretty)
import qualified Data.ByteString.Lazy          as LB
import qualified Data.ByteString.Lazy.Encoding as LB
import           Data.Maybe                    (fromMaybe)
import           Data.Text.Lazy                as T
import           System.IO                     (utf8)
import           WithCli

import           Util                          (printPretty)
import CheckDir (recursiveCheckDir)
import Types (Level(..))

-- | the options this cli tool can take
data Options = Options
  { repository   :: Maybe String
  -- ^ path to the repository containing maps to lint
  , entrypoint   :: Maybe String
  -- ^ entrypoint in that repository
  , allowScripts :: Bool
  -- ^ pass --allowScripts to allow javascript in map
  , json         :: Bool
  -- ^ emit json if --json was given
  , lintlevel        :: Maybe Level
  -- ^ maximum lint level to print
  , pretty       :: Bool
  -- ^ pretty-print the json to make it human-readable
  } deriving (Show, Generic, HasArguments)


main :: IO ()
main = withCli run

run :: Options -> IO ()
run options = do
  let repo = fromMaybe "." (repository options)
  let entry = fromMaybe "main.json" (entrypoint options)
  let level = fromMaybe Suggestion (lintlevel options)

  lints <- recursiveCheckDir repo entry

  if json options
    then printLB
    $ if pretty options then encodePretty lints else encode lints
    else printPretty (level, lints)

-- | haskell's many string types are FUN …
printLB :: LB.ByteString -> IO ()
printLB = putStrLn . T.unpack . LB.decode utf8