1-- | Command line options for nix-style / v2 commands.
2--
3-- The commands take a lot of the same options, which affect how install plan
4-- is constructed.
5module Distribution.Client.NixStyleOptions (
6    NixStyleFlags (..),
7    nixStyleOptions,
8    defaultNixStyleFlags,
9) where
10
11import Distribution.Client.Compat.Prelude
12import Prelude ()
13
14import Distribution.Simple.Command                       (OptionField (..), ShowOrParseArgs)
15import Distribution.Simple.Setup                         (BenchmarkFlags, HaddockFlags, TestFlags)
16import Distribution.Solver.Types.ConstraintSource        (ConstraintSource (..))
17
18import Distribution.Client.ProjectFlags
19       (ProjectFlags (..), defaultProjectFlags, projectFlagsOptions)
20import Distribution.Client.Setup
21       (ConfigExFlags, ConfigFlags (..), InstallFlags (..), benchmarkOptions, configureExOptions,
22       configureOptions, haddockOptions, installOptions, liftOptions, testOptions)
23
24data NixStyleFlags a = NixStyleFlags
25    { configFlags    :: ConfigFlags
26    , configExFlags  :: ConfigExFlags
27    , installFlags   :: InstallFlags
28    , haddockFlags   :: HaddockFlags
29    , testFlags      :: TestFlags
30    , benchmarkFlags :: BenchmarkFlags
31    , projectFlags   :: ProjectFlags
32    , extraFlags     :: a
33    }
34
35nixStyleOptions
36    :: (ShowOrParseArgs -> [OptionField a])
37    -> ShowOrParseArgs -> [OptionField (NixStyleFlags a)]
38nixStyleOptions commandOptions showOrParseArgs =
39        liftOptions configFlags     set1
40        -- Note: [Hidden Flags]
41        -- hide "constraint", "dependency", and
42        -- "exact-configuration" from the configure options.
43        (filter ((`notElem` ["constraint", "dependency"
44                            , "exact-configuration"])
45                 . optionName) $ configureOptions showOrParseArgs)
46     ++ liftOptions configExFlags   set2 (configureExOptions showOrParseArgs
47                               ConstraintSourceCommandlineFlag)
48     ++ liftOptions installFlags   set3
49        -- hide "target-package-db" and "symlink-bindir" flags from the
50        -- install options.
51        -- "symlink-bindir" is obsoleted by "installdir" in ClientInstallFlags
52        (filter ((`notElem` ["target-package-db", "symlink-bindir"])
53                 . optionName) $
54                               installOptions showOrParseArgs)
55       ++ liftOptions haddockFlags set4
56          -- hide "verbose" and "builddir" flags from the
57          -- haddock options.
58          (filter ((`notElem` ["v", "verbose", "builddir"])
59                  . optionName) $
60                                haddockOptions showOrParseArgs)
61     ++ liftOptions testFlags      set5 (testOptions showOrParseArgs)
62     ++ liftOptions benchmarkFlags set6 (benchmarkOptions showOrParseArgs)
63     ++ liftOptions projectFlags   set7 (projectFlagsOptions showOrParseArgs)
64     ++ liftOptions extraFlags     set8 (commandOptions showOrParseArgs)
65  where
66    set1 x flags = flags { configFlags    = x }
67    set2 x flags = flags { configExFlags  = x }
68    set3 x flags = flags { installFlags   = x }
69    set4 x flags = flags { haddockFlags   = x }
70    set5 x flags = flags { testFlags      = x }
71    set6 x flags = flags { benchmarkFlags = x }
72    set7 x flags = flags { projectFlags   = x }
73    set8 x flags = flags { extraFlags     = x }
74
75defaultNixStyleFlags :: a ->  NixStyleFlags a
76defaultNixStyleFlags x = NixStyleFlags
77    { configFlags    = mempty
78    , configExFlags  = mempty
79    , installFlags   = mempty
80    , haddockFlags   = mempty
81    , testFlags      = mempty
82    , benchmarkFlags = mempty
83    , projectFlags   = defaultProjectFlags
84    , extraFlags     = x
85    }
86