Skip to content

Commit 06a140f

Browse files
committed
Use Pretty/Parsec in Init (remote Text Category instance)
1 parent c753f62 commit 06a140f

File tree

3 files changed

+34
-30
lines changed

3 files changed

+34
-30
lines changed

cabal-install/Distribution/Client/Init/FileCreators.hs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@ import Distribution.Client.Init.Types
6565
import Distribution.CabalSpecVersion
6666
import Distribution.Compat.Newtype
6767
( Newtype )
68-
import Distribution.Deprecated.Text
69-
( display, Text(..) )
7068
import Distribution.Fields.Field
7169
( FieldName )
7270
import Distribution.License
@@ -166,8 +164,8 @@ writeChangeLog flags = when ((defaultChangeLog `elem`) $ fromMaybe [] (extraSrc
166164
, ""
167165
, "* First version. Released on an unsuspecting world."
168166
]
169-
pname = maybe "" display $ flagToMaybe $ packageName flags
170-
pver = maybe "" display $ flagToMaybe $ version flags
167+
pname = maybe "" prettyShow $ flagToMaybe $ packageName flags
168+
pver = maybe "" prettyShow $ flagToMaybe $ version flags
171169

172170
-- | Creates and writes the initialized .cabal file.
173171
--
@@ -177,7 +175,7 @@ writeCabalFile flags@(InitFlags{packageName = NoFlag}) = do
177175
message flags "Error: no package name provided."
178176
return False
179177
writeCabalFile flags@(InitFlags{packageName = Flag p}) = do
180-
let cabalFileName = display p ++ ".cabal"
178+
let cabalFileName = prettyShow p ++ ".cabal"
181179
message flags $ "Generating " ++ cabalFileName ++ "..."
182180
writeFileSafe flags cabalFileName (generateCabalFile cabalFileName flags)
183181
return True
@@ -415,7 +413,7 @@ generateCabalFile fileName c =
415413
["A copyright notice."]
416414
True
417415

418-
, fieldS "category" (either id display `fmap` category c)
416+
, fieldS "category" (either id prettyShow `fmap` category c)
419417
[]
420418
True
421419

@@ -500,13 +498,13 @@ generateCabalFile fileName c =
500498

501499
-- | Construct a 'PrettyField' from a field that can be automatically
502500
-- converted to a 'Doc' via 'display'.
503-
field :: Text t
501+
field :: Pretty t
504502
=> FieldName
505503
-> Flag t
506504
-> [String]
507505
-> Bool
508506
-> Maybe (PrettyField FieldAnnotation)
509-
field fieldName fieldContentsFlag = fieldS fieldName (display <$> fieldContentsFlag)
507+
field fieldName fieldContentsFlag = fieldS fieldName (prettyShow <$> fieldContentsFlag)
510508

511509
-- | Construct a 'PrettyField' from a 'String' field.
512510
fieldS :: FieldName -- ^ Name of the field
@@ -596,7 +594,7 @@ generateCabalFile fileName c =
596594
++
597595
generateBuildInfo ExecBuild c
598596
where
599-
exeName = text (maybe "" display . flagToMaybe $ packageName c)
597+
exeName = text (maybe "" prettyShow . flagToMaybe $ packageName c)
600598

601599
libraryStanza :: PrettyField FieldAnnotation
602600
libraryStanza = PrettySection annNoComments (toUTF8BS "library") [] $ catMaybes
@@ -633,7 +631,7 @@ generateCabalFile fileName c =
633631
]
634632
where
635633
testSuiteName =
636-
text (maybe "" ((++"-test") . display) . flagToMaybe $ packageName c)
634+
text (maybe "" ((++"-test") . prettyShow) . flagToMaybe $ packageName c)
637635

638636
-- | Annotations for cabal file PrettyField.
639637
data FieldAnnotation = FieldAnnotation

cabal-install/Distribution/Client/Init/Prompt.hs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,15 @@ module Distribution.Client.Init.Prompt (
2626
import Prelude ()
2727
import Distribution.Client.Compat.Prelude hiding (empty)
2828

29-
import Distribution.Deprecated.ReadP (readP_to_E)
30-
3129
import Control.Monad
3230
( mapM_ )
3331

3432
import Distribution.Client.Init.Types
3533
( InitFlags(..) )
36-
import Distribution.Deprecated.Text
37-
( display, Text(..) )
38-
import Distribution.ReadE
39-
( runReadE )
34+
import Distribution.Parsec
35+
( Parsec, simpleParsec )
36+
import Distribution.Pretty
37+
( Pretty, prettyShow )
4038
import Distribution.Simple.Setup
4139
( Flag(..) )
4240

@@ -69,10 +67,8 @@ promptYesNo =
6967

7068
-- | Create a prompt with optional default value that returns a value
7169
-- of some Text instance.
72-
prompt :: Text t => String -> Maybe t -> IO t
73-
prompt = promptDefault'
74-
(either (const Nothing) Just . runReadE (readP_to_E id parse))
75-
display
70+
prompt :: (Parsec t, Pretty t) => String -> Maybe t -> IO t
71+
prompt = promptDefault' simpleParsec prettyShow
7672

7773
-- | Create a prompt with an optional default value.
7874
promptDefault' :: (String -> Maybe t) -- ^ parser
@@ -99,11 +95,11 @@ mkDefPrompt pr def = pr ++ "?" ++ defStr def
9995

10096
-- | Create a prompt from a list of items, where no selected items is
10197
-- valid and will be represented as a return value of 'Nothing'.
102-
promptListOptional :: (Text t, Eq t)
98+
promptListOptional :: (Pretty t, Eq t)
10399
=> String -- ^ prompt
104100
-> [t] -- ^ choices
105101
-> IO (Maybe (Either String t))
106-
promptListOptional pr choices = promptListOptional' pr choices display
102+
promptListOptional pr choices = promptListOptional' pr choices prettyShow
107103

108104
promptListOptional' :: Eq t
109105
=> String -- ^ prompt

cabal-install/Distribution/Client/Init/Types.hs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
-----------------------------------------------------------------------------
1616
module Distribution.Client.Init.Types where
1717

18+
import Distribution.Client.Compat.Prelude
19+
import Prelude ()
20+
1821
import Distribution.Simple.Setup (Flag(..), toFlag )
1922

2023
import Distribution.Types.Dependency as P
21-
import Distribution.Compat.Semigroup
2224
import Distribution.Version
2325
import Distribution.Verbosity
2426
import qualified Distribution.Package as P
@@ -28,10 +30,10 @@ import Distribution.CabalSpecVersion
2830
import Language.Haskell.Extension ( Language(..), Extension )
2931

3032
import qualified Text.PrettyPrint as Disp
31-
import qualified Distribution.Deprecated.ReadP as Parse
32-
import Distribution.Deprecated.Text
33-
34-
import GHC.Generics ( Generic )
33+
import qualified Distribution.Compat.CharParsing as P
34+
import qualified Data.Map as Map
35+
import Distribution.Pretty (Pretty (..))
36+
import Distribution.Parsec (Parsec (..))
3537

3638
-- | InitFlags is really just a simple type to represent certain
3739
-- portions of a .cabal file. Rather than have a flag for EVERY
@@ -129,6 +131,14 @@ data Category
129131
| Web
130132
deriving (Read, Show, Eq, Ord, Bounded, Enum)
131133

132-
instance Text Category where
133-
disp = Disp.text . show
134-
parse = Parse.choice $ map (fmap read . Parse.string . show) [Codec .. ] -- TODO: eradicateNoParse
134+
instance Pretty Category where
135+
pretty = Disp.text . show
136+
137+
instance Parsec Category where
138+
parsec = do
139+
name <- P.munch1 isAlpha
140+
case Map.lookup name names of
141+
Just cat -> pure cat
142+
_ -> P.unexpected $ "Category: " ++ name
143+
where
144+
names = Map.fromList [ (show cat, cat) | cat <- [ minBound .. maxBound ] ]

0 commit comments

Comments
 (0)