-- | Command line options for nix-style / v2 commands.
--
-- The commands take a lot of the same options, which affect how install plan
-- is constructed.
module Distribution.Client.NixStyleOptions (
    NixStyleFlags (..),
    nixStyleOptions,
    defaultNixStyleFlags,
) where

import Distribution.Client.Compat.Prelude
import Prelude ()

import Distribution.Simple.Command                       (OptionField (..), ShowOrParseArgs)
import Distribution.Simple.Setup                         (BenchmarkFlags, HaddockFlags, TestFlags)
import Distribution.Solver.Types.ConstraintSource        (ConstraintSource (..))

import Distribution.Client.ProjectFlags
       (ProjectFlags (..), defaultProjectFlags, projectFlagsOptions)
import Distribution.Client.Setup
       (ConfigExFlags, ConfigFlags (..), InstallFlags (..), benchmarkOptions, configureExOptions,
       configureOptions, haddockOptions, installOptions, liftOptions, testOptions)

data NixStyleFlags a = NixStyleFlags
    { forall a. NixStyleFlags a -> ConfigFlags
configFlags    :: ConfigFlags
    , forall a. NixStyleFlags a -> ConfigExFlags
configExFlags  :: ConfigExFlags
    , forall a. NixStyleFlags a -> InstallFlags
installFlags   :: InstallFlags
    , forall a. NixStyleFlags a -> HaddockFlags
haddockFlags   :: HaddockFlags
    , forall a. NixStyleFlags a -> TestFlags
testFlags      :: TestFlags
    , forall a. NixStyleFlags a -> BenchmarkFlags
benchmarkFlags :: BenchmarkFlags
    , forall a. NixStyleFlags a -> ProjectFlags
projectFlags   :: ProjectFlags
    , forall a. NixStyleFlags a -> a
extraFlags     :: a
    }

nixStyleOptions
    :: (ShowOrParseArgs -> [OptionField a])
    -> ShowOrParseArgs -> [OptionField (NixStyleFlags a)]
nixStyleOptions :: forall a.
(ShowOrParseArgs -> [OptionField a])
-> ShowOrParseArgs -> [OptionField (NixStyleFlags a)]
nixStyleOptions ShowOrParseArgs -> [OptionField a]
commandOptions ShowOrParseArgs
showOrParseArgs =
        forall b a.
(b -> a) -> (a -> b -> b) -> [OptionField a] -> [OptionField b]
liftOptions forall a. NixStyleFlags a -> ConfigFlags
configFlags     forall {a}. ConfigFlags -> NixStyleFlags a -> NixStyleFlags a
set1
        -- Note: [Hidden Flags]
        -- hide "constraint", "dependency", and
        -- "exact-configuration" from the configure options.
        (forall a. (a -> Bool) -> [a] -> [a]
filter ((forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [String
"constraint", String
"dependency"
                            , String
"exact-configuration"])
                 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. OptionField a -> String
optionName) forall a b. (a -> b) -> a -> b
$ ShowOrParseArgs -> [OptionField ConfigFlags]
configureOptions ShowOrParseArgs
showOrParseArgs)
     forall a. [a] -> [a] -> [a]
++ forall b a.
(b -> a) -> (a -> b -> b) -> [OptionField a] -> [OptionField b]
liftOptions forall a. NixStyleFlags a -> ConfigExFlags
configExFlags   forall {a}. ConfigExFlags -> NixStyleFlags a -> NixStyleFlags a
set2 (ShowOrParseArgs -> ConstraintSource -> [OptionField ConfigExFlags]
configureExOptions ShowOrParseArgs
showOrParseArgs
                               ConstraintSource
ConstraintSourceCommandlineFlag)
     forall a. [a] -> [a] -> [a]
++ forall b a.
(b -> a) -> (a -> b -> b) -> [OptionField a] -> [OptionField b]
liftOptions forall a. NixStyleFlags a -> InstallFlags
installFlags   forall {a}. InstallFlags -> NixStyleFlags a -> NixStyleFlags a
set3
        -- hide "target-package-db" and "symlink-bindir" flags from the
        -- install options.
        -- "symlink-bindir" is obsoleted by "installdir" in ClientInstallFlags
        (forall a. (a -> Bool) -> [a] -> [a]
filter ((forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [String
"target-package-db", String
"symlink-bindir"])
                 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. OptionField a -> String
optionName) forall a b. (a -> b) -> a -> b
$
                               ShowOrParseArgs -> [OptionField InstallFlags]
installOptions ShowOrParseArgs
showOrParseArgs)
       forall a. [a] -> [a] -> [a]
++ forall b a.
(b -> a) -> (a -> b -> b) -> [OptionField a] -> [OptionField b]
liftOptions forall a. NixStyleFlags a -> HaddockFlags
haddockFlags forall {a}. HaddockFlags -> NixStyleFlags a -> NixStyleFlags a
set4
          -- hide "verbose" and "builddir" flags from the
          -- haddock options.
          (forall a. (a -> Bool) -> [a] -> [a]
filter ((forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [String
"v", String
"verbose", String
"builddir"])
                  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. OptionField a -> String
optionName) forall a b. (a -> b) -> a -> b
$
                                ShowOrParseArgs -> [OptionField HaddockFlags]
haddockOptions ShowOrParseArgs
showOrParseArgs)
     forall a. [a] -> [a] -> [a]
++ forall b a.
(b -> a) -> (a -> b -> b) -> [OptionField a] -> [OptionField b]
liftOptions forall a. NixStyleFlags a -> TestFlags
testFlags      forall {a}. TestFlags -> NixStyleFlags a -> NixStyleFlags a
set5 (ShowOrParseArgs -> [OptionField TestFlags]
testOptions ShowOrParseArgs
showOrParseArgs)
     forall a. [a] -> [a] -> [a]
++ forall b a.
(b -> a) -> (a -> b -> b) -> [OptionField a] -> [OptionField b]
liftOptions forall a. NixStyleFlags a -> BenchmarkFlags
benchmarkFlags forall {a}. BenchmarkFlags -> NixStyleFlags a -> NixStyleFlags a
set6 (ShowOrParseArgs -> [OptionField BenchmarkFlags]
benchmarkOptions ShowOrParseArgs
showOrParseArgs)
     forall a. [a] -> [a] -> [a]
++ forall b a.
(b -> a) -> (a -> b -> b) -> [OptionField a] -> [OptionField b]
liftOptions forall a. NixStyleFlags a -> ProjectFlags
projectFlags   forall {a}. ProjectFlags -> NixStyleFlags a -> NixStyleFlags a
set7 (ShowOrParseArgs -> [OptionField ProjectFlags]
projectFlagsOptions ShowOrParseArgs
showOrParseArgs)
     forall a. [a] -> [a] -> [a]
++ forall b a.
(b -> a) -> (a -> b -> b) -> [OptionField a] -> [OptionField b]
liftOptions forall a. NixStyleFlags a -> a
extraFlags     forall {a} {a}. a -> NixStyleFlags a -> NixStyleFlags a
set8 (ShowOrParseArgs -> [OptionField a]
commandOptions ShowOrParseArgs
showOrParseArgs)
  where
    set1 :: ConfigFlags -> NixStyleFlags a -> NixStyleFlags a
set1 ConfigFlags
x NixStyleFlags a
flags = NixStyleFlags a
flags { configFlags :: ConfigFlags
configFlags    = ConfigFlags
x }
    set2 :: ConfigExFlags -> NixStyleFlags a -> NixStyleFlags a
set2 ConfigExFlags
x NixStyleFlags a
flags = NixStyleFlags a
flags { configExFlags :: ConfigExFlags
configExFlags  = ConfigExFlags
x }
    set3 :: InstallFlags -> NixStyleFlags a -> NixStyleFlags a
set3 InstallFlags
x NixStyleFlags a
flags = NixStyleFlags a
flags { installFlags :: InstallFlags
installFlags   = InstallFlags
x }
    set4 :: HaddockFlags -> NixStyleFlags a -> NixStyleFlags a
set4 HaddockFlags
x NixStyleFlags a
flags = NixStyleFlags a
flags { haddockFlags :: HaddockFlags
haddockFlags   = HaddockFlags
x }
    set5 :: TestFlags -> NixStyleFlags a -> NixStyleFlags a
set5 TestFlags
x NixStyleFlags a
flags = NixStyleFlags a
flags { testFlags :: TestFlags
testFlags      = TestFlags
x }
    set6 :: BenchmarkFlags -> NixStyleFlags a -> NixStyleFlags a
set6 BenchmarkFlags
x NixStyleFlags a
flags = NixStyleFlags a
flags { benchmarkFlags :: BenchmarkFlags
benchmarkFlags = BenchmarkFlags
x }
    set7 :: ProjectFlags -> NixStyleFlags a -> NixStyleFlags a
set7 ProjectFlags
x NixStyleFlags a
flags = NixStyleFlags a
flags { projectFlags :: ProjectFlags
projectFlags   = ProjectFlags
x }
    set8 :: a -> NixStyleFlags a -> NixStyleFlags a
set8 a
x NixStyleFlags a
flags = NixStyleFlags a
flags { extraFlags :: a
extraFlags     = a
x }

defaultNixStyleFlags :: a ->  NixStyleFlags a
defaultNixStyleFlags :: forall a. a -> NixStyleFlags a
defaultNixStyleFlags a
x = NixStyleFlags
    { configFlags :: ConfigFlags
configFlags    = forall a. Monoid a => a
mempty
    , configExFlags :: ConfigExFlags
configExFlags  = forall a. Monoid a => a
mempty
    , installFlags :: InstallFlags
installFlags   = forall a. Monoid a => a
mempty
    , haddockFlags :: HaddockFlags
haddockFlags   = forall a. Monoid a => a
mempty
    , testFlags :: TestFlags
testFlags      = forall a. Monoid a => a
mempty
    , benchmarkFlags :: BenchmarkFlags
benchmarkFlags = forall a. Monoid a => a
mempty
    , projectFlags :: ProjectFlags
projectFlags   = ProjectFlags
defaultProjectFlags
    , extraFlags :: a
extraFlags     = a
x
    }