{-# LANGUAGE NoImplicitPrelude   #-}
{-# LANGUAGE NoFieldSelectors    #-}
{-# LANGUAGE OverloadedRecordDot #-}

{-|
Module      : Stack.Types.GlobalOpts
License     : BSD-3-Clause
-}

module Stack.Types.GlobalOpts
  ( GlobalOpts (..)
  , globalOptsBuildOptsMonoidL
  ) where

import          Stack.Prelude
import          Stack.Types.BuildOptsMonoid ( BuildOptsMonoid )
import          Stack.Types.ConfigMonoid ( ConfigMonoid (..) )
import          Stack.Types.DockerEntrypoint ( DockerEntrypoint )
import          Stack.Types.LockFileBehavior ( LockFileBehavior )
import          Stack.Types.StackYamlLoc ( StackYamlLoc )
import          Stack.Types.Snapshot ( AbstractSnapshot )

-- | Parsed global command-line options.

data GlobalOpts = GlobalOpts
  { GlobalOpts -> Maybe String
reExecVersion    :: !(Maybe String)
    -- ^ Expected re-exec in container version

  , GlobalOpts -> Maybe DockerEntrypoint
dockerEntrypoint :: !(Maybe DockerEntrypoint)
    -- ^ Data used when Stack is acting as a Docker entrypoint (internal use

    -- only)

  , GlobalOpts -> LogLevel
logLevel         :: !LogLevel -- ^ Log level

  , GlobalOpts -> Bool
timeInLog        :: !Bool -- ^ Whether to include timings in logs.

  , GlobalOpts -> Bool
rslInLog         :: !Bool
    -- ^ Whether to include raw snapshot layer (RSL) in logs.

  , GlobalOpts -> Bool
planInLog        :: !Bool
    -- ^ Whether to include debug information about the construction of the

    -- build plan in logs.

  , GlobalOpts -> ConfigMonoid
configMonoid     :: !ConfigMonoid
    -- ^ Config monoid, for passing into 'Stack.Config.loadConfig'

  , GlobalOpts -> Maybe AbstractSnapshot
snapshot         :: !(Maybe AbstractSnapshot) -- ^ Snapshot override

  , GlobalOpts -> Maybe WantedCompiler
compiler         :: !(Maybe WantedCompiler) -- ^ Compiler override

  , GlobalOpts -> Bool
terminal         :: !Bool -- ^ We're in a terminal?

  , GlobalOpts -> StylesUpdate
stylesUpdate     :: !StylesUpdate -- ^ SGR (Ansi) codes for styles

  , GlobalOpts -> Maybe Int
termWidthOpt     :: !(Maybe Int) -- ^ Terminal width override

  , GlobalOpts -> StackYamlLoc
stackYaml        :: !StackYamlLoc -- ^ Override project stack.yaml

  , GlobalOpts -> LockFileBehavior
lockFileBehavior :: !LockFileBehavior
  , GlobalOpts -> String
progName         :: !String
    -- ^ The name of the current Stack executable, as it was invoked.

  , GlobalOpts -> Maybe (Path Abs File)
mExecutablePath  :: !(Maybe (Path Abs File))
    -- ^ The path to the current Stack executable, if the operating system

    -- provides a reliable way to determine it and where a result was

    -- available.

  }

-- | View or set the @buildOpts@ field of the @configMonoid@ field of a

-- v'GlobalOpts'.

globalOptsBuildOptsMonoidL :: Lens' GlobalOpts BuildOptsMonoid
globalOptsBuildOptsMonoidL :: Lens' GlobalOpts BuildOptsMonoid
globalOptsBuildOptsMonoidL =
    (GlobalOpts -> ConfigMonoid)
-> (GlobalOpts -> ConfigMonoid -> GlobalOpts)
-> Lens GlobalOpts GlobalOpts ConfigMonoid ConfigMonoid
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (.configMonoid) (\GlobalOpts
x ConfigMonoid
y -> GlobalOpts
x { configMonoid = y })
  ((ConfigMonoid -> f ConfigMonoid) -> GlobalOpts -> f GlobalOpts)
-> ((BuildOptsMonoid -> f BuildOptsMonoid)
    -> ConfigMonoid -> f ConfigMonoid)
-> (BuildOptsMonoid -> f BuildOptsMonoid)
-> GlobalOpts
-> f GlobalOpts
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ConfigMonoid -> BuildOptsMonoid)
-> (ConfigMonoid -> BuildOptsMonoid -> ConfigMonoid)
-> Lens ConfigMonoid ConfigMonoid BuildOptsMonoid BuildOptsMonoid
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (.buildOpts) (\ConfigMonoid
x BuildOptsMonoid
y -> ConfigMonoid
x { buildOpts = y })