Skip to content

Commit a4b3d3d

Browse files
authored
Merge pull request #6727 from commercialhaskell/pvpBounds
Reduce code duplication, re pvpBoundsParser
2 parents 9915ad1 + 9a220c5 commit a4b3d3d

File tree

6 files changed

+62
-49
lines changed

6 files changed

+62
-49
lines changed

package.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ library:
243243
- Stack.Options.NixParser
244244
- Stack.Options.PackageParser
245245
- Stack.Options.PathParser
246+
- Stack.Options.PvpBoundsParser
246247
- Stack.Options.SDistParser
247248
- Stack.Options.ScriptParser
248249
- Stack.Options.SetupParser

src/Stack/Options/HpcReportParser.hs

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,23 @@
22

33
{-|
44
Module : Stack.Options.HpcReportParser
5+
Description : Parser for @stack hpc report@.
56
License : BSD-3-Clause
7+
8+
Parser for @stack hpc report@.
69
-}
710

811
module Stack.Options.HpcReportParser
912
( hpcReportOptsParser
10-
, pvpBoundsOption
1113
) where
1214

13-
import qualified Data.Text as T
1415
import Options.Applicative
15-
( Parser, completer, completeWith, help, long, metavar
16-
, option, readerError, strOption, switch
17-
)
16+
( Parser, completer, help, long, metavar, strOption, switch )
1817
import Options.Applicative.Builder.Extra
1918
( dirCompleter, fileExtCompleter, textArgument )
20-
import Options.Applicative.Types ( readerAsk )
2119
import Stack.Coverage ( HpcReportOpts (..) )
2220
import Stack.Options.Completion ( targetCompleter )
2321
import Stack.Prelude
24-
import Stack.Types.PvpBounds ( PvpBounds, parsePvpBounds )
2522

2623
-- | Parser for @stack hpc report@.
2724
hpcReportOptsParser :: Parser HpcReportOpts
@@ -45,18 +42,3 @@ hpcReportOptsParser = HpcReportOpts
4542
( long "open"
4643
<> help "Open the report in the browser."
4744
)
48-
49-
pvpBoundsOption :: Parser PvpBounds
50-
pvpBoundsOption = option readPvpBounds
51-
( long "pvp-bounds"
52-
<> metavar "PVP-BOUNDS"
53-
<> completeWith ["none", "lower", "upper", "both"]
54-
<> help "How PVP version bounds should be added to Cabal file: none, lower, \
55-
\upper, both."
56-
)
57-
where
58-
readPvpBounds = do
59-
s <- readerAsk
60-
case parsePvpBounds $ T.pack s of
61-
Left e -> readerError e
62-
Right v -> pure v

src/Stack/Options/PvpBoundsParser.hs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{-# LANGUAGE NoImplicitPrelude #-}
2+
{-# LANGUAGE OverloadedStrings #-}
3+
4+
{-|
5+
Module : Stack.Options.PvpBoundsParser
6+
Description : Parser for PVP bounds.
7+
License : BSD-3-Clause
8+
9+
Parser for PVP bounds.
10+
-}
11+
12+
module Stack.Options.PvpBoundsParser
13+
( pvpBoundsParser
14+
) where
15+
16+
import qualified Data.Text as T
17+
import Options.Applicative
18+
( Parser, completeWith, help, long, metavar, option
19+
, readerError
20+
)
21+
import Options.Applicative.Types ( readerAsk )
22+
import Stack.Prelude
23+
import Stack.Types.PvpBounds ( PvpBounds (..), parsePvpBounds )
24+
25+
-- | Parser for PVP bounds.
26+
pvpBoundsParser ::
27+
Maybe Text
28+
-- ^ Optional context for the option's help message.
29+
-> Parser PvpBounds
30+
pvpBoundsParser context = option readPvpBounds
31+
( long "pvp-bounds"
32+
<> metavar "PVP-BOUNDS"
33+
<> completeWith ["none", "lower", "upper", "both"]
34+
<> help (T.unpack helpMsg)
35+
)
36+
where
37+
readPvpBounds = do
38+
s <- readerAsk
39+
case parsePvpBounds $ T.pack s of
40+
Left e -> readerError e
41+
Right v -> pure v
42+
helpMsg =
43+
helpMsgPrefix
44+
<> " PVP version bounds should be added to Cabal file: none, lower, upper, \
45+
\both."
46+
helpMsgPrefix = maybe "How" (<> ", how") context

src/Stack/Options/SDistParser.hs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
{-|
44
Module : Stack.Options.SDistParser
5-
Description : Parse arguments for Stack's @sdist@ and @upload@ commands.
5+
Description : Parse arguments for Stack's @sdist@ command.
66
License : BSD-3-Clause
77
8-
Functions to parse command line arguments for Stack's @sdist@ and @upload@
9-
commands.
8+
Functions to parse command line arguments for Stack's @sdist@ command.
109
-}
1110

1211
module Stack.Options.SDistParser
@@ -20,9 +19,9 @@ import Options.Applicative
2019
import Options.Applicative.Builder.Extra ( boolFlags, dirCompleter )
2120
import Stack.Prelude
2221
import Stack.SDist ( SDistOpts (..) )
23-
import Stack.Options.HpcReportParser ( pvpBoundsOption )
22+
import Stack.Options.PvpBoundsParser ( pvpBoundsParser )
2423

25-
-- | Parse command line arguments for Stack's @sdist@ and @upload@ commands.
24+
-- | Parse command line arguments for Stack's @sdist@ command.
2625
sdistOptsParser :: Parser SDistOpts
2726
sdistOptsParser = SDistOpts
2827
<$> many (strArgument
@@ -31,7 +30,7 @@ sdistOptsParser = SDistOpts
3130
<> help "A relative path to a package directory. Can be specified \
3231
\multiple times. If none specified, use all project packages."
3332
))
34-
<*> optional pvpBoundsOption
33+
<*> optional (pvpBoundsParser Nothing)
3534
<*> ignoreCheckSwitch
3635
<*> buildPackageOption
3736
<*> optional (strOption

src/Stack/Options/UploadParser.hs

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE NoImplicitPrelude #-}
2+
{-# LANGUAGE OverloadedStrings #-}
23

34
{-|
45
Module : Stack.Options.UploadParser
@@ -12,25 +13,22 @@ module Stack.Options.UploadParser
1213
( uploadOptsParser
1314
) where
1415

15-
import qualified Data.Text as T
1616
import Options.Applicative
17-
( Parser, completeWith, completer, flag, help, idm, long
18-
, metavar, option, readerError, short, strArgument, strOption
19-
, switch
17+
( Parser, completer, flag, help, idm, long, metavar, short
18+
, strArgument, strOption, switch
2019
)
2120
import Options.Applicative.Builder.Extra
2221
( boolFlags, dirCompleter, firstBoolFlagsTrue )
23-
import Options.Applicative.Types ( readerAsk )
22+
import Stack.Options.PvpBoundsParser ( pvpBoundsParser )
2423
import Stack.Prelude
2524
import Stack.Upload ( UploadOpts (..), UploadVariant (..) )
26-
import Stack.Types.PvpBounds ( PvpBounds (..), parsePvpBounds )
2725

2826
-- | Parse command line arguments for Stack's @upload@ command.
2927
uploadOptsParser :: Parser UploadOpts
3028
uploadOptsParser = UploadOpts
3129
<$> itemsToWorkWithParser
3230
<*> documentationParser
33-
<*> optional pvpBoundsOption
31+
<*> optional (pvpBoundsParser (Just "For package upload"))
3432
<*> ignoreCheckSwitch
3533
<*> buildPackageOption
3634
<*> tarDirParser
@@ -48,20 +46,6 @@ uploadOptsParser = UploadOpts
4846
<> short 'd'
4947
<> help "Upload documentation for packages (not packages)."
5048
)
51-
pvpBoundsOption :: Parser PvpBounds
52-
pvpBoundsOption = option readPvpBounds
53-
( long "pvp-bounds"
54-
<> metavar "PVP-BOUNDS"
55-
<> completeWith ["none", "lower", "upper", "both"]
56-
<> help "For package upload, how PVP version bounds should be added to \
57-
\Cabal file: none, lower, upper, both."
58-
)
59-
where
60-
readPvpBounds = do
61-
s <- readerAsk
62-
case parsePvpBounds $ T.pack s of
63-
Left e -> readerError e
64-
Right v -> pure v
6549
ignoreCheckSwitch = switch
6650
( long "ignore-check"
6751
<> help "Do not check packages, for upload, for common mistakes."

stack.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ library
279279
Stack.Options.NixParser
280280
Stack.Options.PackageParser
281281
Stack.Options.PathParser
282+
Stack.Options.PvpBoundsParser
282283
Stack.Options.SDistParser
283284
Stack.Options.ScriptParser
284285
Stack.Options.SetupParser

0 commit comments

Comments
 (0)