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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
-----------------------------------------------------------------------------
-- |
-- Module : Distribution.Client.Init.Types
-- Copyright : (c) Brent Yorgey, Benedikt Huber 2009
-- License : BSD-like
--
-- Maintainer : cabal-devel@haskell.org
-- Stability : provisional
-- Portability : portable
--
-- Some types used by the 'cabal init' command.
--
-----------------------------------------------------------------------------
module Distribution.Client.Init.Types where
import Distribution.Simple.Setup
( Flag(..) )
import Distribution.Version
import Distribution.Verbosity
import qualified Distribution.Package as P
import Distribution.License
import Distribution.ModuleName
import Language.Haskell.Extension ( Language(..), Extension )
import qualified Text.PrettyPrint as Disp
import qualified Distribution.Compat.ReadP as Parse
import Distribution.Text
import Data.Monoid
-- | InitFlags is really just a simple type to represent certain
-- portions of a .cabal file. Rather than have a flag for EVERY
-- possible field, we just have one for each field that the user is
-- likely to want and/or that we are likely to be able to
-- intelligently guess.
data InitFlags =
InitFlags { nonInteractive :: Flag Bool
, quiet :: Flag Bool
, packageDir :: Flag FilePath
, noComments :: Flag Bool
, minimal :: Flag Bool
, packageName :: Flag P.PackageName
, version :: Flag Version
, cabalVersion :: Flag VersionRange
, license :: Flag License
, author :: Flag String
, email :: Flag String
, homepage :: Flag String
, synopsis :: Flag String
, category :: Flag (Either String Category)
, extraSrc :: Maybe [String]
, packageType :: Flag PackageType
, mainIs :: Flag FilePath
, language :: Flag Language
, exposedModules :: Maybe [ModuleName]
, otherModules :: Maybe [ModuleName]
, otherExts :: Maybe [Extension]
, dependencies :: Maybe [P.Dependency]
, sourceDirs :: Maybe [String]
, buildTools :: Maybe [String]
, initVerbosity :: Flag Verbosity
, overwrite :: Flag Bool
}
deriving (Show)
-- the Monoid instance for Flag has later values override earlier
-- ones, which is why we want Maybe [foo] for collecting foo values,
-- not Flag [foo].
data PackageType = Library | Executable
deriving (Show, Read, Eq)
instance Text PackageType where
disp = Disp.text . show
parse = Parse.choice $ map (fmap read . Parse.string . show) [Library, Executable]
instance Monoid InitFlags where
mempty = InitFlags
{ nonInteractive = mempty
, quiet = mempty
, packageDir = mempty
, noComments = mempty
, minimal = mempty
, packageName = mempty
, version = mempty
, cabalVersion = mempty
, license = mempty
, author = mempty
, email = mempty
, homepage = mempty
, synopsis = mempty
, category = mempty
, extraSrc = mempty
, packageType = mempty
, mainIs = mempty
, language = mempty
, exposedModules = mempty
, otherModules = mempty
, otherExts = mempty
, dependencies = mempty
, sourceDirs = mempty
, buildTools = mempty
, initVerbosity = mempty
, overwrite = mempty
}
mappend a b = InitFlags
{ nonInteractive = combine nonInteractive
, quiet = combine quiet
, packageDir = combine packageDir
, noComments = combine noComments
, minimal = combine minimal
, packageName = combine packageName
, version = combine version
, cabalVersion = combine cabalVersion
, license = combine license
, author = combine author
, email = combine email
, homepage = combine homepage
, synopsis = combine synopsis
, category = combine category
, extraSrc = combine extraSrc
, packageType = combine packageType
, mainIs = combine mainIs
, language = combine language
, exposedModules = combine exposedModules
, otherModules = combine otherModules
, otherExts = combine otherExts
, dependencies = combine dependencies
, sourceDirs = combine sourceDirs
, buildTools = combine buildTools
, initVerbosity = combine initVerbosity
, overwrite = combine overwrite
}
where combine field = field a `mappend` field b
-- | Some common package categories.
data Category
= Codec
| Concurrency
| Control
| Data
| Database
| Development
| Distribution
| Game
| Graphics
| Language
| Math
| Network
| Sound
| System
| Testing
| Text
| Web
deriving (Read, Show, Eq, Ord, Bounded, Enum)
instance Text Category where
disp = Disp.text . show
parse = Parse.choice $ map (fmap read . Parse.string . show) [Codec .. ]
|