{-# LANGUAGE NoImplicitPrelude #-}

module Stack.Options.NixParser where

import qualified Data.Text                         as T
import           Options.Applicative
import           Options.Applicative.Args
import           Options.Applicative.Builder.Extra
import           Stack.Nix
import           Stack.Options.Utils
import           Stack.Prelude
import           Stack.Types.Nix

nixOptsParser :: Bool -> Parser NixOptsMonoid
nixOptsParser :: Bool -> Parser NixOptsMonoid
nixOptsParser Bool
hide0 = NixOptsMonoid -> NixOptsMonoid
overrideActivation forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
  (First Bool
-> First Bool
-> First [Text]
-> First String
-> First [Text]
-> First [Text]
-> FirstFalse
-> NixOptsMonoid
NixOptsMonoid
  forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String
-> String -> Mod FlagFields (Maybe Bool) -> Parser (First Bool)
firstBoolFlagsNoDefault
                     String
nixCmdName
                     String
"use of a Nix-shell. Implies 'system-ghc: true'"
                     forall {f :: * -> *} {a}. Mod f a
hide
  forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String
-> String -> Mod FlagFields (Maybe Bool) -> Parser (First Bool)
firstBoolFlagsNoDefault
                     String
"nix-pure"
                     String
"use of a pure Nix-shell. Implies '--nix' and 'system-ghc: true'"
                     forall {f :: * -> *} {a}. Mod f a
hide
  forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (First a)
optionalFirst
          (Mod OptionFields [String] -> Parser [Text]
textArgsOption
              (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nix-packages" forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"NAMES" forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. String -> Mod f a
help String
"List of packages that should be available in the nix-shell (space separated)" forall a. Semigroup a => a -> a -> a
<>
               forall {f :: * -> *} {a}. Mod f a
hide))
  forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (First a)
optionalFirst
          (forall a. ReadM a -> Mod OptionFields a -> Parser a
option
              forall s. IsString s => ReadM s
str
              (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nix-shell-file" forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE" forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer ([String] -> Completer
fileExtCompleter [String
".nix"]) forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. String -> Mod f a
help String
"Nix file to be used to launch a nix-shell (for regular Nix users)" forall a. Semigroup a => a -> a -> a
<>
               forall {f :: * -> *} {a}. Mod f a
hide))
  forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (First a)
optionalFirst
          (Mod OptionFields [String] -> Parser [Text]
textArgsOption
              (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nix-shell-options" forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"OPTIONS" forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. String -> Mod f a
help String
"Additional options passed to nix-shell" forall a. Semigroup a => a -> a -> a
<>
               forall {f :: * -> *} {a}. Mod f a
hide))
  forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (First a)
optionalFirst
          (Mod OptionFields [String] -> Parser [Text]
textArgsOption
              (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nix-path" forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PATH_OPTIONS" forall a. Semigroup a => a -> a -> a
<>
               forall (f :: * -> *) a. String -> Mod f a
help String
"Additional options to override NIX_PATH parts (notably 'nixpkgs')" forall a. Semigroup a => a -> a -> a
<>
               forall {f :: * -> *} {a}. Mod f a
hide))
  forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Mod FlagFields FirstFalse -> Parser FirstFalse
firstBoolFlagsFalse
                     String
"nix-add-gc-roots"
                     String
"addition of packages to the nix GC roots so nix-collect-garbage doesn't remove them"
                     forall {f :: * -> *} {a}. Mod f a
hide
  )
  where
    hide :: Mod f a
hide = forall (f :: * -> *) a. Bool -> Mod f a
hideMods Bool
hide0
    overrideActivation :: NixOptsMonoid -> NixOptsMonoid
overrideActivation NixOptsMonoid
m =
      if forall a. a -> First a -> a
fromFirst Bool
False (NixOptsMonoid -> First Bool
nixMonoidPureShell NixOptsMonoid
m)
        then NixOptsMonoid
m { nixMonoidEnable :: First Bool
nixMonoidEnable = (forall a. Maybe a -> First a
First forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> First a -> a
fromFirst Bool
True) (NixOptsMonoid -> First Bool
nixMonoidEnable NixOptsMonoid
m) }
        else NixOptsMonoid
m
    textArgsOption :: Mod OptionFields [String] -> Parser [Text]
textArgsOption = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (a -> b) -> [a] -> [b]
map String -> Text
T.pack) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mod OptionFields [String] -> Parser [String]
argsOption