{-# LANGUAGE NoImplicitPrelude #-}

module Stack.Options.HpcReportParser where

import qualified Data.Text                         as T
import           Options.Applicative
import           Options.Applicative.Builder.Extra
import           Options.Applicative.Types         (readerAsk)
import           Stack.Coverage                    (HpcReportOpts (..))
import           Stack.Options.Completion          (targetCompleter)
import           Stack.Prelude
import           Stack.Types.Config

-- | Parser for @stack hpc report@.

hpcReportOptsParser :: Parser HpcReportOpts
hpcReportOptsParser :: Parser HpcReportOpts
hpcReportOptsParser = [Text] -> Bool -> Maybe String -> Bool -> HpcReportOpts
HpcReportOpts
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Mod ArgumentFields Text -> Parser Text
textArgument forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"TARGET_OR_TIX" forall a. Semigroup a => a -> a -> a
<>
                             forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Completer
targetCompleter forall a. Semigroup a => a -> a -> a
<> [String] -> Completer
fileExtCompleter [String
".tix"]))
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"all" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Use results from all packages and components involved in previous --coverage run")
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"destdir" forall a. Semigroup a => a -> a -> a
<>
                             forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"DIR" forall a. Semigroup a => a -> a -> a
<>
                             forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer Completer
dirCompleter forall a. Semigroup a => a -> a -> a
<>
                             forall (f :: * -> *) a. String -> Mod f a
help String
"Output directory for HTML report"))
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"open" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Open the report in the browser")

pvpBoundsOption :: Parser PvpBounds
pvpBoundsOption :: Parser PvpBounds
pvpBoundsOption =
    forall a. ReadM a -> Mod OptionFields a -> Parser a
option
        ReadM PvpBounds
readPvpBounds
        (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"pvp-bounds" forall a. Semigroup a => a -> a -> a
<>
         forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PVP-BOUNDS" forall a. Semigroup a => a -> a -> a
<>
         forall (f :: * -> *) a. HasCompleter f => [String] -> Mod f a
completeWith [String
"none", String
"lower", String
"upper", String
"both"] forall a. Semigroup a => a -> a -> a
<>
         forall (f :: * -> *) a. String -> Mod f a
help
             String
"How PVP version bounds should be added to .cabal file: none, lower, upper, both")
  where
    readPvpBounds :: ReadM PvpBounds
readPvpBounds = do
        String
s <- ReadM String
readerAsk
        case Text -> Either String PvpBounds
parsePvpBounds forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack String
s of
            Left String
e ->
                forall a. String -> ReadM a
readerError String
e
            Right PvpBounds
v ->
                forall (m :: * -> *) a. Monad m => a -> m a
return PvpBounds
v