never executed always true always false
1 {-# LANGUAGE DeriveGeneric #-}
2
3 -----------------------------------------------------------------------------
4 -- |
5 -- Module : Distribution.Client.Init.Types
6 -- Copyright : (c) Brent Yorgey, Benedikt Huber 2009
7 -- License : BSD-like
8 --
9 -- Maintainer : cabal-devel@haskell.org
10 -- Stability : provisional
11 -- Portability : portable
12 --
13 -- Some types used by the 'cabal init' command.
14 --
15 -----------------------------------------------------------------------------
16 module Distribution.Client.Init.Types where
17
18 import Distribution.Client.Compat.Prelude
19 import Prelude ()
20
21 import Distribution.Simple.Setup (Flag(..), toFlag )
22
23 import Distribution.Types.Dependency as P
24 import Distribution.Version
25 import Distribution.Verbosity
26 import qualified Distribution.Package as P
27 import Distribution.SPDX.License (License)
28 import Distribution.ModuleName
29 import Distribution.CabalSpecVersion
30 import Language.Haskell.Extension ( Language(..), Extension )
31
32 import qualified Text.PrettyPrint as Disp
33 import qualified Distribution.Compat.CharParsing as P
34 import qualified Data.Map as Map
35
36 -- | InitFlags is really just a simple type to represent certain
37 -- portions of a .cabal file. Rather than have a flag for EVERY
38 -- possible field, we just have one for each field that the user is
39 -- likely to want and/or that we are likely to be able to
40 -- intelligently guess.
41 data InitFlags =
42 InitFlags { interactive :: Flag Bool
43 , quiet :: Flag Bool
44 , packageDir :: Flag FilePath
45 , noComments :: Flag Bool
46 , minimal :: Flag Bool
47 , simpleProject :: Flag Bool
48
49 , packageName :: Flag P.PackageName
50 , version :: Flag Version
51 , cabalVersion :: Flag CabalSpecVersion
52 , license :: Flag License
53 , author :: Flag String
54 , email :: Flag String
55 , homepage :: Flag String
56
57 , synopsis :: Flag String
58 , category :: Flag (Either String Category)
59 , extraSrc :: Maybe [String]
60
61 , packageType :: Flag PackageType
62 , mainIs :: Flag FilePath
63 , language :: Flag Language
64
65 , exposedModules :: Maybe [ModuleName]
66 , otherModules :: Maybe [ModuleName]
67 , otherExts :: Maybe [Extension]
68
69 , dependencies :: Maybe [P.Dependency]
70 , applicationDirs :: Maybe [String]
71 , sourceDirs :: Maybe [String]
72 , buildTools :: Maybe [String]
73
74 , initializeTestSuite :: Flag Bool
75 , testDirs :: Maybe [String]
76
77 , initHcPath :: Flag FilePath
78
79 , initVerbosity :: Flag Verbosity
80 , overwrite :: Flag Bool
81 }
82 deriving (Eq, Show, Generic)
83
84 -- the Monoid instance for Flag has later values override earlier
85 -- ones, which is why we want Maybe [foo] for collecting foo values,
86 -- not Flag [foo].
87
88 data BuildType = LibBuild | ExecBuild
89 deriving Eq
90
91 -- The type of package to initialize.
92 data PackageType = Library | Executable | LibraryAndExecutable
93 deriving (Show, Read, Eq)
94
95 displayPackageType :: PackageType -> String
96 displayPackageType LibraryAndExecutable = "Library and Executable"
97 displayPackageType pkgtype = show pkgtype
98
99 instance Monoid InitFlags where
100 mempty = gmempty
101 mappend = (<>)
102
103 instance Semigroup InitFlags where
104 (<>) = gmappend
105
106 defaultInitFlags :: InitFlags
107 defaultInitFlags = mempty
108 { initVerbosity = toFlag normal
109 }
110
111 -- | Some common package categories (non-exhaustive list).
112 data Category
113 = Codec
114 | Concurrency
115 | Control
116 | Data
117 | Database
118 | Development
119 | Distribution
120 | Game
121 | Graphics
122 | Language
123 | Math
124 | Network
125 | Sound
126 | System
127 | Testing
128 | Text
129 | Web
130 deriving (Read, Show, Eq, Ord, Bounded, Enum)
131
132 instance Pretty Category where
133 pretty = Disp.text . show
134
135 instance Parsec Category where
136 parsec = do
137 name <- P.munch1 isAlpha
138 case Map.lookup name names of
139 Just cat -> pure cat
140 _ -> P.unexpected $ "Category: " ++ name
141 where
142 names = Map.fromList [ (show cat, cat) | cat <- [ minBound .. maxBound ] ]