aboutsummaryrefslogtreecommitdiff
path: root/src/CabalHelper/Shared/InterfaceTypes.hs
blob: 352deb044d0770f917652eba6a4f030cd97f63c2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
-- cabal-helper: Simple interface to Cabal's configuration state
-- Copyright (C) 2015-2018  Daniel Gröber <cabal-helper@dxld.at>
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.

{-# LANGUAGE DeriveGeneric, DeriveDataTypeable, DefaultSignatures #-}

{-|
Module      : CabalHelper.Shared.InterfaceTypes
Description : Types which are used by c-h library and executable to communicate
License     : GPL-3

These types are used to communicate between the cabal-helper library and helper
executable, using Show/Read. If any types in this module change the major
version must be bumped since this will be exposed in the @Distribution.Helper@
module.

The cached executables in @$XDG_CACHE_HOME/cabal-helper@ use the cabal-helper
version (among other things) as a cache key so we don't need to worry about
talking to an old executable.
-}
module CabalHelper.Shared.InterfaceTypes where

import GHC.Generics
import Data.Version
import Data.Map.Strict (Map)

data ChResponse
    = ChResponseComponentsInfo (Map ChComponentName ChComponentInfo)
    | ChResponseList           [String]
    | ChResponseLbi            String
    | ChResponseVersion        (String, Version)
    | ChResponseFlags          [(String, Bool)]
  deriving (Eq, Ord, Read, Show, Generic)

data ChComponentName = ChSetupHsName
                     | ChLibName ChLibraryName
                     | ChFLibName String
                     | ChExeName String
                     | ChTestName String
                     | ChBenchName String
  deriving (Eq, Ord, Read, Show, Generic)

data ChLibraryName = ChMainLibName
                   | ChSubLibName String
  deriving (Eq, Ord, Read, Show, Generic)

newtype ChModuleName = ChModuleName { unChModuleName :: String }
    deriving (Eq, Ord, Read, Show, Generic)

data ChComponentInfo = ChComponentInfo
    { ciComponentName         :: ChComponentName
    -- ^ The component\'s type and name

    , ciGhcOptions            :: [String]
    -- ^ Full set of GHC options, ready for loading this component into GHCi.

    , ciSourceDirs            :: [String]
    -- ^ A component's @hs-source-dirs@ field, note that this only contains the
    -- directories specified by the cabal file, however cabal also adds the
    -- output directory of preprocessors to GHC's search path when
    -- building. TODO: make this easier to use.

    , ciEntrypoints           :: ChEntrypoint
    -- ^ Modules or files Cabal would have the compiler build directly. Can be
    -- used to compute the home module closure for a component.
    } deriving (Eq, Ord, Read, Show)

data ChEntrypoint
    = ChSetupEntrypoint
      { chMainIs :: FilePath
      }
    | ChLibEntrypoint
      { chExposedModules :: [ChModuleName]
      , chOtherModules   :: [ChModuleName]
      , chSignatures     :: [ChModuleName] -- backpack only
      }
    | ChExeEntrypoint
      { chMainIs         :: FilePath
      , chOtherModules   :: [ChModuleName]
      } deriving (Eq, Ord, Read, Show, Generic)

data ChPkgDb = ChPkgGlobal
             | ChPkgUser
             | ChPkgSpecific FilePath
               deriving (Eq, Ord, Read, Show, Generic)