{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

{-|
Module      : Stack.Options.BenchParser
Description : Parser for benchmark arguments.
License     : BSD-3-Clause

Parser for benchmark arguments.
-}

module Stack.Options.BenchParser
 ( benchOptsParser
 ) where

import           Options.Applicative ( Parser, help, long, metavar, strOption )
import           Options.Applicative.Builder.Extra
                   ( firstBoolFlagsTrue, optionalFirst )
import           Stack.Prelude
import           Stack.Options.Utils ( hideMods )
import           Stack.Types.BuildOptsMonoid ( BenchmarkOptsMonoid (..) )

-- | Parser for bench arguments.

-- FIXME hiding options

benchOptsParser :: Bool -> Parser BenchmarkOptsMonoid
benchOptsParser :: Bool -> Parser BenchmarkOptsMonoid
benchOptsParser Bool
hide0 = First String -> FirstTrue -> BenchmarkOptsMonoid
BenchmarkOptsMonoid
  (First String -> FirstTrue -> BenchmarkOptsMonoid)
-> Parser (First String)
-> Parser (FirstTrue -> BenchmarkOptsMonoid)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String -> Parser (First String)
forall (f :: * -> *) a. Alternative f => f a -> f (First a)
optionalFirst (Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
        (  String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"benchmark-arguments"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"ba"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"BENCH_ARGS"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"Arguments passed to the benchmarks. Supports path variables \
                \provided by the Cabal build system."
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields String
forall {f :: * -> *} {a}. Mod f a
hide
        ))
  Parser (FirstTrue -> BenchmarkOptsMonoid)
-> Parser FirstTrue -> Parser BenchmarkOptsMonoid
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Mod FlagFields FirstTrue -> Parser FirstTrue
firstBoolFlagsTrue
        String
"run-benchmarks"
        String
"running of targeted benchmarks."
        Mod FlagFields FirstTrue
forall {f :: * -> *} {a}. Mod f a
hide
 where
  hide :: Mod f a
hide = Bool -> Mod f a
forall (f :: * -> *) a. Bool -> Mod f a
hideMods Bool
hide0